我有一个包含条件编译符号的 C# 项目,比如说 SYMBOL。
如何在 Azure Pipeline 中将此 SYMBOL 设置为 true 或 false,然后使用此设置运行 MSBuild?
可以使用MSBuild输入配置吗,或者还有其他方法吗?
亚姆尔:
- task: MSBuild@1
displayName: 'Build solution'
inputs:
solution: 'X.csproj'
platform: 'AnyCPU'
configuration: 'Release'
msbuildArguments: '/target:Publish'
clean: true
enabled: true
如果有某种输入,例如“conditionalCompilationSymbol”,那就太好了。
在您的
csproj
文件或 DirectoryBuild.props
文件中,您可以基于 MSBuild 属性定义常量
<PropertyGorup Condition=" '$(ApplySymbol)' == 'true'">
<DefineConstants>SYMBOL;$(DefineConstants)</DefineConstants>
</PropertyGroup>
每当设置 MSBuild 属性时,它都会 add SYMBOL 到已定义的常量中。
msbuildArguments: '/target:Publish /p:ApplySymbol=true'
要从管道中调用它,您只需将其添加为参数
尝试将
DefineConstants
作为属性传递(通过 p
开关):
msbuildArguments: '/target:Publish /p:DefineConstants="MyValue;DEBUG"'
符号可以被定义 (
#define
),但不能有值。
DefineConstants
属性,其值将传递给 C# 编译器。该属性的值预计是一个以分号分隔的符号列表。
/p
开关将属性传递给 msbuild。
在yaml中,
msbuildArguments
将被修改:
Yaml:
- task: MSBuild@1
displayName: 'Build solution'
inputs:
solution: 'X.csproj'
platform: 'AnyCPU'
configuration: 'Release'
msbuildArguments: '/target:Publish /p:DefineConstants=SYMBOL'
clean: true
enabled: true
在 C# 代码中,条件编译块如下所示:
#if SYMBOL
...
#endif
不幸的是,如果项目已经定义了
DefineConstants
属性并且在命令行上传递了 DefineConstants
的属性定义,则将使用命令行值。
添加到可能存在的符号集不支持开箱即用,但相对容易处理。
Directory.Build.targets
文件(如果尚不存在)。 (不要使用 Directory.Build.props
文件。props 文件会在项目定义 DefineConstants
之前提前加载。)
在
Directory.Build.targets
文件中添加以下 PropertyGroup
:
<PropertyGroup Condition="$(DefineAdditionalConstants) != ''">
<DefineConstants Condition="$(DefineConstants) != ''">$(DefineConstants);$(DefineAdditionalConstants)</DefineConstants>
<DefineConstants Condition="$(DefineConstants) == ''">$(DefineAdditionalConstants)</DefineConstants>
</PropertyGroup>
在命令行上使用
DefineAdditionalConstants
:
Yaml:
- task: MSBuild@1
displayName: 'Build solution'
inputs:
solution: 'X.csproj'
platform: 'AnyCPU'
configuration: 'Release'
msbuildArguments: '/target:Publish /p:DefineAdditionalConstants=SYMBOL'
clean: true
enabled: true