У меня есть три проекта, я назову их ProjectSource, ProjectProcessor и ProjectTarget
ProjectSource - это библиотека .NET Standard 2.0, создающая DLL.
ProjectProcessor - это консольная библиотека .NET Core 2.1,ProjectProcessor имеет ссылку на проект на ProjectSource.Он загружает DLL-файл ProjectSource и, основываясь на некоторых типах, которые он там находит, генерирует несколько выходных файлов (допустим, что они являются документацией).Количество создаваемых файлов может со временем меняться.
ProjectTarget - консольное приложение .NET Framework 4.7.1.Он зависит от ProjectSource, но также должен включать вывод содержимого ProjectProcessor.
Все проекты - это наш код, поэтому мы можем немного их изменить.
Мой вопрос: чтоправильный способ получить выходные файлы содержимого ProjectProcessor, записанные в выходной каталог ProjectTarget?
Подход 1. Один из подходов, который не сработал, - это использовать ссылку проекта в ProjectTarget на ProjectProcessor.Это привело к ошибке сборки, когда консольное приложение .NET Framework 4.7.1 ссылается на консольную библиотеку .NET Core 2.1.Я бы не хотел, чтобы все выходные данные проекта копировались, просто сгенерированные файлы документации.Я попробовал ProjectReference с ReferenceOutputAssembly = "false" и OutputItemType = "Content".
Подход 2. Другой подход заключается в том, чтобы выполнить этап предварительной или последующей сборки для ProjectTarget, который вызывает консольное приложение ProjectProcessor, передаваятекущий целевой каталог (ProjectTarget).Например:
<PropertyGroup>
<PreBuildEvent>dotnet $(SolutionDir)projects\ProjectProcessor\$(OutDir)netcoreapp2.1\ProjectProcessor.dll $(TargetDir)</PreBuildEvent>
</PropertyGroup>
Это работает с прискорбным недостатком, который он не распознает, когда ему нужно бежать (я думаю, что он всегда будет работать?).Если в ProjectSource или ProjectProcessor есть изменения кода, я бы хотел, чтобы он запускался снова, но не иначе.(на основе MSBuild скопировать выходные данные из другого проекта в выходные данные текущего проекта )
Подход 3: Наконец, поиск в Google заставил меня попробовать добавить цель, подобную этой:
<Target Name="GenerateDocumentationContent" BeforeTargets="AfterBuild">
<MSBuild Projects="..\ProjectProcessor\ProjectProcessor.csproj" BuildInParallel="false" Targets="Build">
<Output TaskParameter="TargetOutputs" ItemName="DocumentationOutputDir" />
</MSBuild>
<Exec Command="dotnet @(DocumentationOutputDir) $(TargetDir)"/>
</Target>
Это создает проект ProjectProcessor, как и ожидалось, и вызывает получающееся консольное приложение с правильными параметрами.Но он не запускается в том случае, если ProjectTarget не имеет изменений, и я хочу, чтобы он запускался, если ProjectSource и ProjectProcessor имеют изменения.