msbuild: как создать и запустить консольное приложение в сборке и записать ли оно выходные файлы в выходной каталог другого проекта? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть три проекта, я назову их 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 имеют изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...