Как я могу поделиться свойствами сборки с внешними проектами?

#c# #.net-core #msbuild

Вопрос:

У меня есть два проекта на C#, каждый в своем собственном репозитории. Хранилища проверяются бок о бок. Чтобы проиллюстрировать это, структура каталогов выглядит примерно так:

 Shared/
Shared/Shared.csproj

Foo/
Foo/Options.targets
Foo/Foo.csproj
 

Проект Foo ссылается на Общий проект. Общий проект не знает о существовании Foo.

В репозитории Foo у меня есть файл Options.targets, содержащий различные свойства сборки и определения препроцессора. Этот файл необходимо импортировать при создании Foo.csproj, а также при создании Shared.csproj в качестве зависимости от Foo.

Включение целевого файла в Foo.csproj не является проблемой:

 <!-- Foo.csproj -->

<Import Project="..Options.targets" />

<ItemGroup>
  <ProjectReference Include="..SharedShared.csproj" />
</ItemGroup>
 

Я не могу найти надежный способ распространения Options.targets для создания Shared.csproj. Я могу как бы взломать его, используя MSBuildStartupDirectory свойство:

 <!-- Shared.csproj -->

<Import Project="$(MSBuildStartupDirectory)..Options.targets" 
        Condition="exists('$(MSBuildStartupDirectory)..Options.targets')" />
 

Но это ломается, если проект построен из другого рабочего каталога (т. Е. dotnet build ./Shared.csproj Нормально, но dotnet build ./Shared/Shared.csproj не будет работать).

Как я могу надежно включить целевой файл при создании общего проекта?

Комментарии:

1. Почему бы не создать пакет nuget для «общего доступа». Это своего рода то, для чего он был разработан.

2. Распространение предварительно скомпилированной сборки вообще не решает проблему. Представьте себе Foo1..N, каждая ссылка является общей и требует, чтобы она была построена с немного другими параметрами.

3. Непроверено, но: можно добавить SetPlatform и SetConfiguration в ссылку на проект (см. Документы), и поскольку они фактически реализованы как передача свойств=$(SetPlatform) в задачу MSBuild, она должна работать для передачи произвольных свойств, т. Е. <ProjectReference Include="..SharedShared.csproj"><SetPlatform>Platform=$(Platform);SomeProperty=ABC</SetPlatform></ProjectReference>