使用“dotnet build”或“dotnetpublish”时如何指定引用项目的构建配置?

Wal*_*t D 6 .net msbuild .net-core

我有一个 .NET Core 3 项目,它引用了其他几个项目。我的主根项目有Release-X构建配置,但其他项目只有一个Release配置,没有匹配的Release-X配置。

当我尝试使用此发布我的主根项目时......

dotnet publish MyProject.csproj -c Release-X

...它似乎对所有引用的项目使用了一些神秘的不存在的默认构建配置。(我可以这么说,因为引用的项目允许在其所有构建配置中使用不安全代码,但使用上述命令进行构建会导致不安全代码错误。)

我希望能够使用其Release-X构建配置来构建我的主根项目,但使用其Release配置来构建所有引用的项目。我该怎么做呢?

Mar*_*ich 6

配置值被设置为全局属性,该属性在整个项目图上强制执行,直到项目到项目的引用显式更改它为止。

有三种方法可以解决这个问题,但请注意,由于 NuGet 恢复逻辑的差异,从 Visual Studio 内部构建或从命令行构建 .sln 文件时,这可能会导致结果不一致(但如果没有属性,应该没问题Condition)在 csproj 中依赖的包或项目引用上$(Configuration)

  1. 为引用的项目设置显式配置(我建议使用它):

     <Project Sdk="Microsoft.NET.Sdk">
       ....
       <PropertyGroup>
         <ReferencedConfiguration>$(Configuration)</ReferencedConfiguration>
         <ReferencedConfiguration Condition="'$(Configuration)' == 'Release-X'">Release</ReferencedConfiguration>
       </PropertyGroup>
       <ItemGroup>
         <ProjectReference Include="..\other\project.csproj" AdditionalProperties="Configuration=$(ReferencedConfiguration)" />
       </ItemGroup>
     </Project>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 防止全局配置跨项目引用流动。这不好,因为它在目标项目中默认为“调试”,但这是处理它的一种可能的方法:

     <Project Sdk="Microsoft.NET.Sdk">
       ...
       <ItemGroup>
         <ProjectReference Include="..\other\project.csproj" UndefineProperties ="Configuration" />
       </ItemGroup>
     </Project>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 更改引用的项目,使其不将“配置”视为全局属性(如果设置)并覆盖它。这需要在 SDK 导入之前发生,以便正确影响依赖于它的所有逻辑:

     <Project TreatAsLocalProperty="Configuration">
       <PropertyGroup Condition="'$(Configuration)' != '' and '$(Configuration)' != 'Debug' and '$(Configuration)' != 'Release'">
         <Configuration>Release</Configuration>
       </PropertyGroup>
       <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
    
       .... (other project content)
    
       <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
     </Project>
    
    Run Code Online (Sandbox Code Playgroud)