【问题标题】:Build with msbuild and dynamically set project references使用 msbuild 构建并动态设置项目引用
【发布时间】:2022-01-17 20:42:50
【问题描述】:

我有几个引用 SQL Server 程序集的项目。对于 SQL Server 2005 和 SQL Server 2008,我目前维护 2 个项目文件,它们指向相同的源文件,唯一的区别是对 SQL Server 程序集的引用。

有什么方法可以让我只维护一个项目并在我的构建脚本中动态指定引用?

【问题讨论】:

  • 2005 年的程序集是否对 2008 年无效?
  • 否,但 2008 程序集确实适用于 2005 年。唯一的问题是我在 codeplex 上发布了几个这样的项目,我喜欢为只有 SQL 2005 和一个用于拥有 2008 年的人。其中一些程序集在 GAC 中,因此(据我所知)我无法重新分配所有依赖项。即使可以,我也不确定我是否会膨胀我的发布大小。

标签: msbuild reference


【解决方案1】:

寻找与您遇到的相同问题的解决方案我提出了在 ItemGroup 上设置条件的建议解决方案。但这有一个副作用,因为在 Visual Studio 引用中我可以看到这两个引用,这也影响了 ReSharper。

我终于使用了“否则选择何时选择”,并且 ReSharper 和 Visual Studio 显示两个引用不再有任何问题。

<Choose>
  <When Condition=" '$(Configuration)' == 'client1DeployClickOnce' ">
    <ItemGroup>
        <ProjectReferenceInclude="..\client1\app.Controls\app.Controls.csproj">
        <Project>{A7714633-66D7-4099-A255-5A911DB7BED8}</Project>
        <Name>app.Controls %28Sources\client1\app.Controls%29</Name>
      </ProjectReference>
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <ProjectReference Include="..\app.Controls\app.Controls.csproj">
        <Project>{2E6D4065-E042-44B9-A569-FA1C36F1BDCE}</Project>
        <Name>app.Controls %28Sources\app.Controls%29</Name>
      </ProjectReference>
    </ItemGroup>
  </Otherwise>
</Choose>

您可以在我的博客文章中阅读更多相关信息:[在您的 MSBuild 项目文件中使用 Condition 的 ProjectReference][https://laurentkempe.com/2009/12/03/ProjectReference-with-Condition-in-your-MSBuild -project-files/]

【讨论】:

  • 很好的解决方案 Laurent,重复的引用很烦人,这个解决方案解决了这个问题。谢谢!
【解决方案2】:

每个 MSBuild 元素(几乎每个)都可以有一个 Condition 与之关联。我的建议是您编辑项目文件(它本身就是一个 MSBuild 文件)并将所有 SQL 服务器引用放在具有条件的 ItemGroup 中,例如:

  <ItemGroup Condition="'$(SqlServerTargetEdition)'=='2005'">
    <!-- SQL Server 2005 References here -->
    <Reference Include="..."/>
  </ItemGroup>

还有另一个用于 Sql server 2008 的 ItemGroup:

  <ItemGroup Condition="'$(SqlServerTargetEdition)'=='2008'">
    <!-- SQL Server 2008 References here -->
    <Reference Include="..."/>
  </ItemGroup>

您应该在声明这些项目之前为属性 SqlServerTargetEdition 提供一个默认值。然后在命令行中,您可以在调用 msbuild.exe 时使用 /p 开关覆盖该值。

赛义德·易卜拉欣·哈希米

我的书:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

【讨论】:

  • 好书!我有它,它拯救了我的理智!说,很高兴在 Stack Overflow 上见到你!
  • 这听起来正是我所追求的。今晚我会在家里测试一下。谢谢赛义德!
猜你喜欢
  • 2016-09-23
  • 1970-01-01
  • 2012-03-09
  • 2018-09-07
  • 2019-09-28
  • 2011-06-07
  • 2012-04-23
  • 2010-10-06
  • 1970-01-01
相关资源
最近更新 更多