#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>