我有一个包含许多引用的项目,它们都是有条件的,显示我手动编辑了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
我想知道是否还有其他更好的方式呢?
我主要关注的是,根据配置类型存储和管理引用。
答案 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
编辑:添加了导入说明