MSBuild - 设置解决方案的属性

Maf*_*uba 13 .net msbuild visual-studio-2008

我们正在使用带有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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jus*_* R. 15

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

  • 如果共享道具文件名为`Directory.Build.props`,它将自动导入到目录层次结构中的所有项目中. (6认同)
  • 我喜欢这个解决方案,但它仍然意味着项目文件至少需要编辑一次. (2认同)
  • 谢谢@MartinUllrich,这有效!更多信息:https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-your-build (2认同)

Tar*_*nin 8

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

代码在GitHub上.