Visual Studio条件项目配置编辑器

时间:2011-12-19 14:57:19

标签: visual-studio msbuild

我有一个包含许多引用的项目,它们都是有条件的,显示我手动编辑了Proj文件,如下所示,

  <ItemGroup Condition=" '$(Configuration)' == 'Release' ">
    <Reference Include="Assembly1">
      <HintPath>..\Release\Path\Assembly1</HintPath>
    </Reference>
    <Reference Include="Assembly2">
      <HintPath>..\Release\Path\Assembly2</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
    <Reference Include="Assembly1">
      <HintPath>..\Debug\Path\Assembly1</HintPath>
    </Reference>
    <Reference Include="Assembly2">
      <HintPath>..\Debug\Path\Assembly2</HintPath>
    </Reference>
  </ItemGroup>

注意,这只是一个示例,只有两个配置,发布和调试,目前我们每个平台有4个配置,我们正在处理存储近12个配置,3个用于.NET 3.5,.NET 4和.NET 4.5

我想知道是否还有其他更好的方式呢?

  1. 是否有任何visual studio插件允许我们在某种UI中进行这些配置,而不是编辑xml,因为它日复一日变得复杂。
  2. MSBuild中是否有任何脚本或任何可能读取某些自定义xml或某些数据存储区的脚本,我们可以自动执行此过程吗?
  3. 如果我为不同的配置创建不同的VSProj文件,那么确保正确添加内容文件非常耗时,但唯一的问题是引用。
  4. 是否有其他工具可以轻松管理每个配置的引用?
  5. 我主要关注的是,根据配置类型存储和管理引用。

1 个答案:

答案 0 :(得分:4)

我会这样做:

在名为“Common.props”

的文件中
<Project ...>
  <ItemGroup> 
    <Reference Include="Assembly1"> 
      <HintPath>..\$(Configuration)\Path\Assembly1</HintPath> 
    </Reference> 
    <Reference Include="Assembly2"> 
      <HintPath>..\$(Configuration)\Path\Assembly2</HintPath> 
    </Reference> 
  </ItemGroup> 
</Project>

您可以将它放入一个单独的Common.props文件中,如图所示,并使用Import元素在所有项目文件中“包含”它,因此只需要一个维护点,如下所示:

<Project ...>
  <PropertyGroup>
    <Configuration Condition="'$(Configuration)' == ''>Debug</Configuration>
    ...other properties
  </PropertyGroup>
  <Import Project="Common.props" />
  ...rest of your C# project file
</Project>

上面显示的导入位置的重要意义在于,在定义了$(配置)的默认值之后,如果没有指定,则在导入中使用适当的值。您当然可以将此默认值声明以及更多内容移动到Common.props文件中。如果你这样做,你的项目文件通常只有4个属性(项目指南,命名空间,程序集名称,项目类型),导入,要编译的文件列表,以及任何不常见的程序集引用或项目引用。我的项目通常从不在其中包含任何条件属性,因为它们几乎总是被分解为共享导入。

没有好的UI可以做到这一点,VS IDE UI非常有限,我从来没有用它来更改任何项目属性,而是依赖于自定义工具,通常是自定义MSBuild任务来检查项目文件确保它们是一致的,并使用PowerShell脚本修改它们以进行常见更改。

摘自书籍MSBuild Trickery技巧#14 - 18

编辑:添加了导入说明