当使用`dotnet build`或`dotnet publish`时如何为参考项目指定构建配置?

时间:2019-10-06 15:43:29

标签: .net .net-core msbuild

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

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

dotnet publish MyProject.csproj -c Release-X

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

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

1 个答案:

答案 0 :(得分:1)

配置值设置为global property,该值将在整个项目图上强制执行,直到项目间引用显式更改此值为止。

有三种方法可以解决此问题,但请注意,由于NuGet还原逻辑的不同,从Visual Studio内部构建或从命令行构建.sln文件时,这可能会导致结果不一致(但是如果您选择您的csproj中没有Condition依赖于$(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>
    
  2. 防止全局配置流过项目间引用。这不好,因为它将在目标项目中默认为“ Debug”,但这是一种可能的处理方式:

    <Project Sdk="Microsoft.NET.Sdk">
      ...
      <ItemGroup>
        <ProjectReference Include="..\other\project.csproj" UndefineProperties ="Configuration" />
      </ItemGroup>
    </Project>
    
  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>