我有三个项目,我将它们称为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更改的情况下运行,它就不会运行。