【问题标题】:Build utility application and execute it in pre-build of another project构建实用程序并在另一个项目的预构建中执行它
【发布时间】:2019-01-15 11:39:32
【问题描述】:

场景

我想要一个解决方案,其中包含:

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

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

问题

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

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

编辑

相关:MSBuild build order

【问题讨论】:

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


    【解决方案1】:

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

    如果您想这样做,您可以在类库的预构建事件中调用 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)..\您的问题的根本原因也与此有关,让我解释一下。)。

    原因

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

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

    希望这会有所帮助。

    【讨论】:

    • 感谢您分享您的想法。我只是不明白为什么 msbuild 不像 VisualStudio 在使用解决方案文件调用 msbuild 时那样使用解决方案信息。使用 msbuild,先生成预生成事件,然后生成依赖项。在 VS 中,首先构建依赖关系,然后是预构建事件。
    • @helb,我用一个简单的示例对其进行了测试,当我使用 MSBuild 构建解决方案文件时它工作正常。您是如何添加项目引用的?您是否使用项目到项目?如果是,您的项目可能有一些特殊设置。无论如何,我的答案中的解决方案应该是可行的。您可以接受它作为答案。这对阅读此线程的其他社区成员可能是有益的。如果您对问题的构建顺序感兴趣,那应该是另一个问题,您可以打开一个包含更多信息的新线程并提供示例,一些如何构建它的步骤,我将继续关注。
    • 我会去看看。同时,我猜你的解决方案是最好的方法。
    • @LeoLiu-MSFT $(ProjectDir).. 的问题是,如果在UtilityApplication -> Properties -> Additional Include Directory 中使用$(SolutionDir),则无法正确解决。但是使用MSBuild $(SolutionDir)MySolution.sln /t:UtilityApplication时不会出现这个问题。
    【解决方案2】:

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

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

    【讨论】:

    • NuGet 无疑有助于在两个构建过程之间存储二进制文件,感谢提及。但是,在单个构建过程中构建所有内容的基本问题仍然存在。
    猜你喜欢
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2011-03-02
    • 2010-11-19
    相关资源
    最近更新 更多