构建实用程序应用程序并在另一个项目的预构建中执行它

Build utility application and execute it in pre-build of another project

场景

我想要一个包含以下内容的解决方案:

而且我想使用 msbuild 构建整个解决方案。 此外,我需要 在 class 库的预构建事件 中执行该实用程序。

问题

将 Utility.exe 设置为 Library.dll 的项目依赖项并不好,因为在构建 依赖项目之前 调用了预构建。

我目前正在考虑在构建整个解决方案之前仅 Utility.exe 调用 msbuild。有更好/更清洁的解决方案吗?

编辑

相关:MSBuild build order

一种选择是将 utility.exe 构建为具有自己的构建过程的独立应用程序。然后此构建可以将二进制文件打包为 nuget 包并将其存储在 nuget 存储库中(这可能只是一个文件共享)

一旦你有了可用的包,你就可以将它作为对 library.dll 的 nuget 引用添加,并在你的构建过程中有一个额外的步骤,在构建步骤之前恢复 nuget 包。然后您的预生成事件可以从 nuget 包文件夹中调用。

I need to execute the Utility in a pre-build event of the class library.

如果你想这样做,你可以在 class 库的预构建事件中调用 MSBuild.exe 来构建命令行应用程序 (Utility.exe),喜欢:

"C:\Program Files (x86)\MSBuild.0\Bin\MSBuild.exe" "$(ProjectDir)..\UtilityApplication\UtilityApplication.csproj" /p:Configuration=$(Configuration) /p:Platform=$(Platform)

"$(ProjectDir)..\UtilityApplication\bin\Debug\UtilityApplication.exe"

注意:不要使用$(SolutionDir)而不是$(ProjectDir)..\你问题的根本原因也与此有关,让我解释一下。).

原因:

解决方案包含项目,但一个项目可以在多个不同的解决方案中(或根本没有解决方案),因此我们在单独构建项目时无法访问解决方案信息。这就是为什么我们在构建项目UtilityApplication.csproj时无法使用$(SolutionDir)的原因。

这也是导致您出现问题的罪魁祸首,因为项目参考信息仅存在于解决方案信息中。因此,如果您构建解决方案文件或从 Visual Studio 构建项目,您将不会遇到问题,在构建相关项目后调用预构建。

希望对您有所帮助。