Автоматически вкладывать файлы в библиотеку класса .csproj (DependentUpon) - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть несколько C# файлов, которые я генерирую. Я хотел бы, чтобы они автоматически помещались в соответствующий файл C# в обозревателе решений Visual Studio. Например, Foo.Generated.cs и Bar.Generated.cs будут вложены в Foo.cs и Bar.cs соответственно.

Если возможно, я бы хотел иметь возможность управлять этим в моем Справочнике. Файл Build.props, поэтому все библиотеки классов в моем решении будут работать одинаково.

Версии

  • . NET Core 3.1
  • Visual Studio 2019 (16.5.3)

Неудачная попытка A:

<Compile Update="**\*Generated.cs">
  <DependentUpon>$([System.String]::Copy(%(Filename)).Replace('.Generated', '.cs'))</DependentUpon>
</Compile>

Неудачная попытка B:

<Compile Update="**\*Generated.cs">
  <DependentUpon>%(Filename)</DependentUpon>
</Compile>

Неудачная попытка C:

<Compile Update="**\*Generated.cs">
  <DependentUpon>%(Filename).cs</DependentUpon>
</Compile>

Вышеупомянутые подходы также были опробованы с:

<ItemGroup>
  <ProjectCapability Include="DynamicDependentFile" />
  <ProjectCapability Include="DynamicFileNesting" />
</ItemGroup>

1 Ответ

1 голос
/ 10 апреля 2020

Если возможно, я бы хотел иметь возможность управлять этим в моем файле Directory.Build.props, поэтому все библиотеки классов в моем решении будут работать одинаково.

Сначала , я думаю, вы должны использовать Directory.Build.targets вместо Directory.Build.props. Как показывает этот документ , Directory.Build.props импортируется очень рано в Microsoft.Common.props, и элементы Itemgroup распознаются после свойств MSBuild, поэтому при добавлении элементов в Directory.Build.props эти элементы не будут распознаваться MSBuild.

Однако , Directory.Build.targets импортируется очень поздно, и MSBuild уже начинает их распознавать, и с его помощью вы можете добавлять любые элементы, которые можно распознать в этом файле.

Решение

1) изменить файл на Directory.Build.targets

2) добавить эти (ваши ) в нем:

<Compile Update="**\*Generated.cs">
  <DependentUpon>$([System.String]::Copy(%(Filename)).Replace('.Generated', '.cs'))</DependentUpon>
</Compile>

И он работает на мою сторону и надеюсь, что он может вам помочь.

...