构建实用程序应用程序并在另一个项目的预构建中执行它
Build utility application and execute it in pre-build of another project
场景
我想要一个包含以下内容的解决方案:
- 命令行应用程序(Utility.exe)
- 一个class库(Library.dll)
- 还有很多其他需要构建的东西
而且我想使用 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 构建项目,您将不会遇到问题,在构建相关项目后调用预构建。
希望对您有所帮助。
场景
我想要一个包含以下内容的解决方案:
- 命令行应用程序(Utility.exe)
- 一个class库(Library.dll)
- 还有很多其他需要构建的东西
而且我想使用 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 构建项目,您将不会遇到问题,在构建相关项目后调用预构建。
希望对您有所帮助。