【问题标题】:How to build dependent project first with msbuild如何先用 msbuild 构建依赖项目
【发布时间】:2019-04-24 12:25:37
【问题描述】:

我刚刚开始研究 msbuild,因为我想制作自己的构建脚本。现在我可以创建只编译一个项目的构建脚本,但是我该如何处理依赖关系呢?

例如,如果我有两个使用这两个 msbuild 脚本构建的项目怎么办?

  1. projectA.xml
  2. projectB.xml

我如何告诉 msbuild 在我执行 projectB.xml 时它应该首先执行 projectA.xml?

我已经用谷歌搜索了很多,但它似乎没有得到像我这样的初学者理解的任何东西。我会非常高兴有一个链接到描述这个的文章,或者可能只是一个小代码示例。

我想要这个控件的原因是因为我正在构建一个库。该库由几个项目组成。开发人员应该能够拉取库的源代码并只构建他想要的库。

实际上,我希望能够从不同的项目构建 .net 模块。这就是为什么我希望能够运行自定义的 msbuild 脚本。

【问题讨论】:

    标签: c# .net-4.0 msbuild


    【解决方案1】:

    如果您使用两个项目创建解决方案,您可以使用 msbuild 定位 .sln 文件,而不是直接构建项目,它应该处理项目依赖关系:)

    但是,如果您使用的是标准 .csproj 项目...

    好的,我查看了我正在处理的一个项目,它是这样的:

    <ItemGroup>
       <ProjectReference Include="..\SomeFolder\SomeProject.csproj">
          <Project>{1A94B405-2D01-4A09-90D5-A5B31180A03B}</Project>
          <Name>SomeProjectNamespace</Name>
       </ProjectReference>
    </ItemGroup>
    

    这里有一个关于参考的MSDN page。向下滚动直到找到 ProjectReference...

    【讨论】:

    • 进一步回答我的问题,也许您可​​以创建两个项目,其中一个依赖于另一个,然后查看 .sln 和 .csproj 文件的样子,也许这会告诉您如何在您自己的自定义脚本。
    • 在我上一条评论的基础上,我为你做了那个,并用详细信息编辑了我的答案:)
    • +1 用于建议 .sln 文件。如果没有理由不希望 VisualStudio 管理构建顺序,请不要重新发明轮子。
    • 我更新了我的问题以解释为什么我希望能够自定义构建过程。我将研究 ProjectReference 目标!感谢分享。
    • 由于“查看项目文件”提示,我对此投了赞成票。这是我没有意识到要使用的有用资源。谢谢你。
    【解决方案2】:

    我设置了我的构建脚本,以便我有一些不做任何事情的公共目标,但使用 DependsOnTargets 来设置项目依赖项并运行构建。

    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <!-- ************************************************************************************************ -->
      <!-- Targets that run the builds -->
      <!-- ************************************************************************************************ -->
      <Target Name="AutoBuild" DependsOnTargets="BuildProject1;BuildProject2;BuildInstallers">
        <OnError ExecuteTargets="NotifyFailure" />
      </Target>
      <Target Name="FullCompile" DependsOnTargets="BuildProject1;BuildProject2">
        <OnError ExecuteTargets="NotifyFailure" />
      </Target>
    
      <!-- Build Project 1 -->
      <Target Name="BuildProject1">
        <!-- Use MSBuild task and point it to build project1.csproj, project1.sln or whatever your projects is -->
      </Target>
    
      <!-- Build Project 2 -->
      <Target Name="BuildProject2">
        <!-- Use MSBuild task and point it to build project2.csproj, project2.sln or whatever your projects is -->
      </Target>
    
      <Target Name="BuildInstallers">
        <!-- Whatever logic you have for building installers -->
      </Target>
    
    </Project>
    

    【讨论】:

    • 由于 MSBuild 任务提示,我接受了这一点。这正是我想要使用的。在这个任务中,我可以参考另一个项目来构建。谢谢你。
    • 我想构建项目而不必将它们实际包含在我的解决方案中,这可能吗?
    【解决方案3】:

    MSBuild issue #2887 中讨论了类似的情况。该线程还显示了官方ProjectReference Protocol的链接。

    【讨论】:

    • 感谢您提供该链接!我遇到了与那里讨论的完全相同的问题......最后有一个解决方案真是太好了。
    【解决方案4】:

    您不需要使用 sln 进行构建。如果您在 csproj 中使用项目引用,则依赖顺序由 MSBuild 处理。 试试看。自动。 您不需要在 msbuild 脚本中对依赖顺序进行排序。

    【讨论】:

    • 这并不总是有效。当我将解决方案从 VS 2010 转换为 VS 2012 时,该依赖项目永远不会在 MSBuild.exe 中构建(但在 VS 2012 中会构建)。但是,按照“appclay”的描述添加项目提示,现在两者都可以使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2010-11-25
    • 2013-01-30
    • 2012-08-20
    • 1970-01-01
    相关资源
    最近更新 更多