MSBuild 属性

属性是可用于配置生成的名称/值对。 在将值传递给任务、计算条件,以及存储将在整个项目文件中引用的值时,可以使用属性。

在项目文件中定义和引用属性

属性的声明方式是:创建一个与属性同名的元素,将其指定为 PropertyGroup 元素的子元素。 例如,下面的 XML 创建一个名为 BuildDir 的属性,其值为 Build。

<PropertyGroup>
    <BuildDir>Build</BuildDir>
</PropertyGroup>

在整个项目文件中,可以使用语法 $(PropertyName) 来引用属性。 例如,可以使用 $(BuildDir) 引用上例中的属性。

通过重定义属性可以更改属性值。 使用下面的 XML 可以为 BuildDir 属性指定新值:

<PropertyGroup>
    <BuildDir>Alternate</BuildDir>
</PropertyGroup>

属性按其在项目文件中出现的顺序进行计算。 必须先将旧值赋给 BuildDir,然后才能声明其新值。

保留属性

MSBuild 保留了一些属性名称,用于存储有关项目文件和 二进制 MSBuild 文件的信息。 与任何其他属性一样,这些属性也通过 $ 表示法进行引用。 例如,$(MSBuildProjectFile) 返回项目文件的完整文件名,包括文件扩展名。

有关更多信息,请参见如何:引用项目文件的名称或位置MSBuild 保留属性和已知属性

环境属性

可以像引用保留属性那样,在项目文件中引用环境变量。 例如,若要在项目文件中使用 PATH 环境变量,请使用 $(Path)。 如果项目中包含的某个属性定义与环境属性同名,则项目中的这个属性将重写环境变量的值。

每个 MSBuild 项目都有一个隔离环境块:它只能看到对自己块的读写。在项目文件被计算或生成之前,MSBuild 初始化属性集合时仅读取环境变量。 在此之后,环境变量属性是静态的,也就是说,每个生成工具使用相同的名称和值启动。

从一个给定的工具中获取环境变量的当前值,使用 属性函数 System.Environment.GetEnvironmentVariable。 然而,首选方法是使用带有任务 EnvironmentVariables 参数的方法。 此字符串数组中的环境属性集可以传递给指定的工具,而不影响系统环境变量。

提示

并非所有的环境变量被读入成为初始属性。任何不是有效的 MSBuild 属性名称的环境变量如“386”,将被忽略。

有关详细信息,请参阅如何:在生成中使用环境变量

注册表属性

可以使用下面的语法读取系统注册表值,其中 Hive 为注册表配置单元(例如 HKEY_LOCAL_MACHINE),Key 为注册表项名称,SubKey 为子项名称,Value 为子项的值。

$(registry:Hive\MyKey\MySubKey@Value)

若要获取默认子项值,请省略 Value。

$(registry:Hive\MyKey\MySubKey)

此注册表值可以用于初始化生成属性。 例如,若要创建表示 Visual Studio Web 浏览器主页的生成属性,请使用此代码:

<PropertyGroup>
  <VisualStudioWebBrowserHomePage>
    $(registry:HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\WebBrowser@HomePage)
  </VisualStudioWebBrowserHomePage>
<PropertyGroup>

全局属性

MSBuild 允许您在命令行中使用 /property(或 /p)开关设置属性。 这些全局属性值会重写在项目文件中设置的属性值。 这包括环境属性,但不包括保留属性,保留属性无法更改。

下面的示例将 Configuration 全局属性设置为 DEBUG。

msbuild.exe MyProj.proj /p:Configuration=DEBUG

还可以使用 MSBuild 任务的 Properties 特性,为多项目生成中的子项目设置或修改全局属性。 有关详细信息,请参阅MSBuild 任务

如果您使用 TreatAsLocalProperty 属性在项目标记中指定一个属性,则项目文件中设置的属性值不会被全局的属性值重写。 有关更多信息,请参见Project 元素 (MSBuild)如何:使用不同选项生成相同的源文件

属性函数

在 .NET Framework 4 版中,可以使用属性函数来计算您的 MSBuild 脚本。 可以在生成脚本中读取系统时间、比较字符串、匹配正则表达式及执行多种其他操作,而无需使用 MSBuild 任务。

可以使用字符串(实例)方法来操作任何属性值,还可以调用许多系统类的静态方法。 例如,通过以下方式可以将生成属性设置为当天的日期。

<Today>$([System.DateTime]::Now.ToString("yyyy.MM.dd"))</Today>

有关更多信息以及属性函数的列表,请参见属性函数

在执行过程中创建属性

如果属性位于 Target 元素之外,则在生成的计算阶段为其赋值。 在随后的执行阶段中,可以如下创建或修改属性:

  • 属性可以由任何任务发出。 若要发出属性,Task 元素必须有具备 PropertyName 特性的 Output 子元素。

  • 属性可以由 CreateProperty 任务发出。 此用法已弃用。

  • 从 .NET Framework 3.5 开始,Target 元素可以包含 PropertyGroup 元素,后者可以包含属性声明。

在属性中存储 XML

属性可以包含任意 XML,这有助于将值传递给任务,或是显示日志记录信息。 下面的示例显示 ConfigTemplate 属性,该属性具有的值包含 XML 和其他属性引用。 MSBuild 使用属性引用的相应属性值来替换属性引用。 属性的赋值按其出现顺序进行。 因此,在此示例中应已定义 $(MySupportedVersion)、$(MyRequiredVersion) 和 $(MySafeMode)。

<PropertyGroup>
    <ConfigTemplate>
        <Configuration>
            <Startup>
                <SupportedRuntime
                    ImageVersion="$(MySupportedVersion)"
                    Version="$(MySupportedVersion)"/>
                <RequiredRuntime
                    ImageVersion="$(MyRequiredVersion)
                    Version="$(MyRequiredVersion)"
                    SafeMode="$(MySafeMode)"/>
            </Startup>
        </Configuration>
    </ConfigTemplate>
</PropertyGroup>

请参见

任务

如何:在生成中使用环境变量

如何:引用项目文件的名称或位置

如何:使用不同选项生成相同的源文件

参考

MSBuild 保留属性和已知属性

Property 元素 (MSBuild)

其他资源

MSBuild 概念

MSBuild