【问题标题】:MSBuild - Set Properties For SolutionMSBuild - 为解决方案设置属性
【发布时间】:2011-01-18 14:12:58
【问题描述】:

我们使用 .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 的机器上签出和构建,而无需安装开发工具包)。该解决方案是由开发人员使用 MSBuild 在命令行上构建的,安装批处理文件、CCNet 等。

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

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

【问题讨论】:

    标签: .net visual-studio-2008 msbuild


    【解决方案1】:

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

    【讨论】:

    • 我喜欢这个解决方案,但它仍然意味着项目文件至少需要编辑一次。
    • @Mafuba 我已经使用 NuGet 自动化了这个。
    • fyi 使用 VS 2017 如果共享道具文件名为Directory.Build.props,它将自动导入到目录层次结构中的所有项目中。
    • 感谢@MartinUllrich,这行得通!更多信息:docs.microsoft.com/en-us/visualstudio/msbuild/…
    【解决方案2】:

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

    代码在GitHub

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-11
        • 1970-01-01
        • 2021-05-14
        相关资源
        最近更新 更多