如何使用名为 Configuration 的 MSBuild 命令行参数作为条件编译符号?

010*_*101 5 c# msbuild visual-studio

我想显示一个字符串,告诉用户使用哪个构建配置来构建应用程序。例如:

如果命令行类似于:

msbuild project.sln /t:Build /p:Configuration=Release
Run Code Online (Sandbox Code Playgroud)

然后在源代码中,我想这样做:

Console.Writeline("You are running the " + <get the /p:Configuration value> + " version" );
Run Code Online (Sandbox Code Playgroud)

用户会看到:

您正在运行 Release 版本

我知道,我们可以宣布在命令条件编译符号(#定义),例如提示符如何定义在这篇文章中这一个。但我想使用名为Configuration.

out*_*man 4

没有办法做到这一点,除非像你所说的=使用#if。MSBuild 配置名称只是项目文件中用于构建项目的特定风格的配置集的名称。默认情况下,您无权从代码中访问此配置名称。

我看到有两种方法可以更改代码中的字符串:

a)正如你所说 - 你可以指定条件编译符号,所以你可以做类似的事情

#if DEBUG
const string Flavor = "Debug";
#else
const string Flavor = "Release";
#endif
...
Console.WriteLine("You are running the " + Flavor + " version" );
Run Code Online (Sandbox Code Playgroud)

b) 您可以使用项目文件并根据配置包含不同的文件集。如果您将卸载项目并将 csproj 作为文件打开 - 您将看到例如

<ItemGroup>
  <Compile Include="MyApp.cs" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

您可以更改为类似以下内容:

<ItemGroup>
  <Compile Include="MyApp.Release.cs" Condition="'$(Configuration)'=='Release'" />
  <Compile Include="MyApp.Debug.cs" Condition="'$(Configuration)'=='Debug'" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

因此,这就是为每个配置包含不同文件集的方法,您可以在其中指定用户现在拥有的配置。