MSBuild - 设置解决方案的属性

时间:2010-02-19 00:17:41

标签: .net visual-studio-2008 msbuild

我们正在使用带有VS2008的.NET 3.5。我有一个包含约20个项目的解决方案,随着应用程序的增长和添加新模块,该数字将随着时间的推移而增长。今天我需要在每个项目上设置一个属性。我必须编辑每个csproj文件以添加以下内容:

  <Target Name="BeforeBuild">
    <CreateProperty Condition=" '$(SolutionDir)' != '' And '$(SolutionDir)' != '*Undefined*' " 
                    Value="$(SolutionDir)Tools\MSBuild">
      <Output TaskParameter="Value" PropertyName="AlToolPath" />
    </CreateProperty>
  </Target>

这是为了让项目能够找到存储在我的源存储库中的程序集链接器(AL.exe),以便构建与机器无关(可以在任何带.NET的机器上检出并构建,而无需安装SDK)。该解决方案基于命令行构建,使用开发人员的MSBuild,安装批处理文件,CCNet等。

无论如何,我搜索了一个更好的方法来执行此操作(即类似于解决方案级别属性),但找不到一个。我知道可以在MSBuild命令行中设置属性值,但这对我来说不能很好地扩展,因为所有现有和将来的命令行都必须包含它。我还考虑过在第一个构建项目中调用before target来使用自定义任务来设置环境变量,并在最后一个项目中使用after目标来删除它,但这似乎比单独编辑所有项目文件更加沉重和脆弱

如果您已经做过类似的事情或者知道如何为每个可以被多个项目(包括我没有经验的.NET 4 / VS2010)使用的解决方案设置属性,请告诉我。请记住,我们使用MSBuild来构建sln文件,而不是单个项目。

3 个答案:

答案 0 :(得分:15)

您可以在单个文件中指定此属性以及所有其他常用属性,并通过在项目文件中包含Import语句来加载它。这就是我们在构建环境中所做的事情,它具有220个内置项目和多个共享项目文件(例如“分支”)。它运作良好。

答案 1 :(得分:8)

我已经多次实现了 @ fatcat111 建议的解决方案。这次我使用NuGet - Common.Props自动完成了此过程。该软件包将在解决方案级别添加一个公共道具文件,并通过在同一解决方案的多个项目中安装该软件包,可以共享这些属性。

代码位于GitHub

答案 2 :(得分:1)

由于解决方案文件不是MSBuild文件,因此您将无法执行此类操作。您唯一的选择是处理它或使用主msbuild文件来代替构建解决方案文件。一种选择可能是创建构建过程使用的特殊配置。对于解决方案文件,您可以指定使用的配置。