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

时间:2018-08-08 09:07:32

标签: visual-studio-2015 msbuild pre-build-event

场景

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

  • 命令行应用程序(Utility.exe)
  • 类库(Library.dll)
  • 许多其他需要构建的东西

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

问题

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

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

编辑

相关:MSBuild build order

2 个答案:

答案 0 :(得分:1)

一个选择是使用自己的生成过程将utility.exe生成为单独的应用程序。然后,此版本可以将二进制文件打包为nuget包,并将其存储在nuget存储库中(这可能只是文件共享)

一旦有了可用的软件包,就可以将其作为对library.dll的nuget引用进行添加,并且在构建过程中还有一个附加步骤,可以在构建步骤之前恢复nuget软件包。然后,您的prebuild事件可以从nuget包文件夹中调用。

答案 1 :(得分:1)

  

我需要在类库的预构建事件中执行实用程序。

如果要这样做,可以在类库的pre-build事件中调用MSBuild.exe来构建命令行应用程序(Utility.exe),例如:

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

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

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

)。

原因

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

这也是导致您出现问题的元凶,因为项目参考信息仅存在于解决方案信息中。因此,如果您通过Visual Studio构建解决方案文件或构建项目,则不会出现问题,在构建依赖项目之后将调用预构建。

希望这会有所帮助。