使用msbuild构建并动态设置项目引用

8
我有几个项目涉及 SQL Server 组件。目前我维护了两个项目文件,分别引用相同的源文件,唯一不同的是对 SQL Server 组件的引用。
我是否可以只维护一个项目,并在我的构建脚本中动态指定所需的引用?

2005年的程序集不能在2008年环境下使用吗? - John Saunders
不过,2008的程序集确实可以对2005起作用。唯一的问题是我在codeplex上发布了几个这些项目,并且我想为那些只有SQL 2005和那些有2008的人发布一个版本。其中一些程序集在GAC中,所以(据我所知)我不能重新分发所有依赖项。即使我可以,我也不确定是否想要膨胀我的发布大小。 - Darren Gosbell
2个回答

17

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

最终我使用了Choose When Otherwise,现在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项目文件中使用条件的ProjectReference][https://laurentkempe.com/2009/12/03/ProjectReference-with-Condition-in-your-MSBuild-project-files/]


很棒的解决方案,Laurent。重复引用真的很烦人,这个解决方案修复了这个问题。谢谢! - Darren Gosbell

5

几乎每个 MSBuild 元素都可以与 条件 关联。我建议您编辑项目文件(它本身是一个 MSBuild 文件),并将所有 SQL 服务器引用放置在一个 ItemGroup 中,该 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开关覆盖该值。
Sayed Ibrahim Hashimi
我的书:深入了解Microsoft Build引擎:使用MSBuild和Team Foundation Build

太棒了!我有这本书,它拯救了我的理智!Sayed,在Stack Overflow上见到你真是太好了! - Cyberherbalist
这听起来正是我想要的。今晚我会在家测试一下。谢谢,Sayed! - Darren Gosbell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接