#.net #visual-studio #msbuild
Вопрос:
Я хочу добавить новый элемент / тип в пункт> Свойства> «Действие сборки» из пакета (т.Е. nuget)
Я использовал Avalonia в качестве ссылки:
- Файл схемы элемента
- Avalonia.props
- Avalonia.target
- AvaloniaBuildTasks.props
- AvaloniaBuildTasks.targets
- Avalonia.csproj
Я вырезал много ненужного, что оставило меня с этим:
- Project.props
<?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <PropertyPageSchema Include="$(MSBuildThisFileDirectory)PermissionsText.xml" /> <AvailableItemName Include="PermissionsText" /> <CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="SourceItemGroup"/> </ItemGroup> <ItemGroup Condition="'$(EnableDefaultItems)'=='True'"> <PermissionsText Include="***.ptxt" /> </ItemGroup> <Target Name="_InjectAdditionalFiles" BeforeTargets="GenerateMSBuildEditorConfigFileShouldRun"> <ItemGroup> <AdditionalFiles Include="@(PermissionsText)" SourceItemGroup="PermissionsText" /> </ItemGroup> </Target> </Project>
- Project.targets
<?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <None Remove="***.ptxt" /> </ItemGroup> </Project>
- Project.csproj
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> <IncludeBuildOutput>false</IncludeBuildOutput> <!-- Package Info --> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.2" PrivateAssets="all" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0" PrivateAssets="all" /> </ItemGroup> <ItemGroup> <None Include="$(OutputPath)$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" /> <Content Include="PermissionsText.xml"> <Pack>true</Pack> <PackagePath>build;buildTransitive</PackagePath> </Content> <Content Include="PermissionsNodeGenerator.props"> <Pack>true</Pack> <PackagePath>build;buildTransitive</PackagePath> </Content> <Content Include="PermissionsNodeGenerator.targets"> <Pack>true</Pack> <PackagePath>build;buildTransitive</PackagePath> </Content> </ItemGroup> </Project>
- Другие файлы проекта доступны здесь
Я часами смотрел на это и код Avalonia, и я очень уверен, что они похожи, однако, похоже, я не могу понять, почему типы Avalonia появляются, а мои нет. Из того, что я могу сказать, наиболее важной частью является AvailableItemName
and PropertyPageSchema
, оба из которых присутствуют в файле props . Я также очень уверен, что файл props очень загружен. Мой проект зависит от дополнительных файлов (определенных в том же файле props) и приведет к сбою, InvalidOperationException: Sequence contains no elements
если они не были определены
После этого я наткнулся на это руководство от mmaitre314. Он помещает свойства AvailableItemName
и PropertyPageSchema
в целевые объекты вместо реквизитов, я пытался это сделать, надеясь, что это сработает, однако оно по-прежнему не отображалось при выполнении действия сборки
Любая помощь приветствуется, заранее спасибо!
Комментарии:
1. Я прошу прощения. Я опубликовал его в SoftwareEngineering главным образом потому, что он больше посвящен настройке и развертыванию, а не фактическому программированию
Ответ №1:
Я думаю, это должно сработать. Провели несколько тестов, и, похоже, нам нужно что-то сделать или подождать некоторое время, чтобы оно отображалось (задержка? Возможно).
Трудно сказать, какой шаг имеет значение или заставить его работать, но я делал эти вещи:
1). Щелкните правой кнопкой мыши проект (тестовый проект)> Выгрузить проект> снова щелкните правой кнопкой мыши> Перезагрузить проект.
2). Закрытый проект (тестовый проект), а затем снова открыл его.
3). Создал .ptxt
файл и включил его в проект. Исключил его, а затем снова включил.
Комментарии:
1. Привет! Спасибо за ответ. Как вы ссылались на анализатор? Я создал как nupkg, а затем поместил его в папку и добавил эту папку в качестве источника nuget, а затем установил ее. По какой-то причине это у меня не работает. Однако, если я ссылаюсь на него как на проект, он работает, но я хочу отправить его как nupkg, а не как проект
Ответ №2:
Я не совсем уверен, почему, или как, или что, но: Я удалил свою локальную копию проекта, клонировал его по предоставленной ссылке на GitHub, перестроил его и повторно сослался на него, и теперь он работает.
У меня было несколько предположений, почему это могло не сработать, хотя все они кажутся ложными:
- Генераторы / анализаторы исходного кода не могут определять свои собственные типы контента / действия сборки. Удаление части анализатора не помогло
- Я тестировал его в проекте .NET Core 3.1, но это был генератор исходного кода .NET Standard 2.0. Переназначение любого проекта на соответствие не помогло
- Файл схемы, реквизиты и / или целевые файлы отформатированы неправильно. Проверил их более 10 раз, и я уверен, что это не проблема
- Тестовый проект
.vs
илиobj
папка кэшировали старую версию проекта, в которой не было пользовательских типов. Я удалил их, хотя это не помогло, кроме того, восстановление из точной копии на GitHub работает, но не моя локальная копия - Имя проекта слишком длинное / плохо отформатировано (я здесь в отчаянии). Также неправильно, создал проект с именем
ClassLibrary1LONGNAMESourceGenerator
(обязательно включил номера), скопировал файлы и перестроил его. Сработало, поэтому проблема не в имени - Несколько других сумасшедших догадок
В любом случае спасибо за помощь!