msbuild:如何在内部版本中构建并运行控制台应用程序,并使其将输出文件写入另一个项目的输出目录?

时间:2018-12-19 21:50:17

标签: msbuild

我有三个项目,我将它们称为ProjectSource,ProjectProcessor和ProjectTarget

ProjectSource是一个生成DLL的.NET Standard 2.0库。

ProjectProcessor是一个.NET Core 2.1控制台库。 ProjectProcessor在ProjectSource上有一个项目参考。它加载ProjectSource DLL,并根据在其中找到的某些类型生成一些输出文件(仅说它们是文档)。它产生的文件数可以随时间变化。

ProjectTarget是.NET Framework 4.7.1控制台应用程序。它具有对ProjectSource的依赖关系,但还需要包括ProjectProcessor输出的内容。

所有项目都是我们的代码,因此我们可以对其进行很多更改。

我的问题是,将ProjectProcessor的内容输出文件写入ProjectTarget的输出目录的正确方法是什么?

方法1:一种无效的方法是使用ProjectTarget中对ProjectProcessor的项目引用。它产生了一个生成错误,即.NET Framework 4.7.1控制台应用程序引用了.NET Core 2.1控制台库。无论如何,我都不想复制所有项目输出,而只复制生成的文档文件。我确实尝试了一个带有ReferenceOutputAssembly =“ false”和OutputItemType =“ Content”的ProjectReference。

方法2:另一种方法是在ProjectTarget上进行构建前或构建后的步骤,以调用ProjectProcessor控制台应用程序, 当前目标目录(ProjectTarget的)。例如:

<PropertyGroup> <PreBuildEvent>dotnet $(SolutionDir)projects\ProjectProcessor\$(OutDir)netcoreapp2.1\ProjectProcessor.dll $(TargetDir)</PreBuildEvent> </PropertyGroup>

这有效,但不幸的缺点是它无法识别何时需要运行(我认为它总是可以运行?)。如果是ProjectSource或 ProjectProcessor进行了代码更改,我希望它可以再次运行,但不能以其他方式运行。 (基于MSBuild copy output from another project into the output of the current project

方法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更改的情况下运行,它就不会运行。

0 个答案:

没有答案