MSBuild - 为解决方案设置属性

15

我们正在使用.NET 3.5和VS2008。我的解决方案中有约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目标以使用自定义任务设置环境变量,并在最后一个项目中调用after目标以删除它,但这似乎比仅编辑所有项目文件更加繁重和脆弱。
请告诉我是否已经做过类似的事情或知道一种可以一次设置整个解决方案中多个项目都可利用的属性的方法(包括.NET 4 / VS2010,我没有经验)。请记住,我们使用MSBuild构建sln文件,而不是单个项目。
3个回答

18
你可以在一个文件中指定这个属性以及其他常见的属性,并通过在你的项目文件中包含导入(Import)语句来加载它。这就是我们在构建环境中所做的事情,该环境有大约220个构建项目和多个共享项目文件(例如,“branch”)。它运行得很好。

2
我喜欢这个解决方案,但仍然意味着项目文件至少需要编辑一次。 - Mafuba
1
@Mafuba 我已经使用 NuGet 自动化了这个过程。 - Taras Alenin
8
若使用VS 2017,若一个共享属性文件名为Directory.Build.props,则它将自动导入到该目录层次结构中的所有项目中。 - Martin Ullrich
2
谢谢@MartinUllrich,那个可行!更多信息:https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-your-build - EM0

8
我已经多次实施了@fatcat111提出的解决方案。这一次,我通过使用NuGet - Common.Props自动化了这个过程。该软件包将在解决方案级别上添加一个通用的props文件,并通过在同一解决方案的多个项目中安装该软件包来共享属性。
代码可在GitHub上找到。

1

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


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