Как добавить новое в действие сборки из пакета

#.net #visual-studio #msbuild

Вопрос:

Я хочу добавить новый элемент / тип в пункт> Свойства> «Действие сборки» из пакета (т.Е. nuget)

Скриншот действия сборки

Я использовал Avalonia в качестве ссылки:

Я вырезал много ненужного, что оставило меня с этим:

  • 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 (обязательно включил номера), скопировал файлы и перестроил его. Сработало, поэтому проблема не в имени
  • Несколько других сумасшедших догадок

В любом случае спасибо за помощь!