【问题标题】:How to specify build configuration for referenced projects when using `dotnet build` or `dotnet publish`?使用 `dotnet build` 或 `dotnet publish` 时如何为引用的项目指定构建配置?
【发布时间】:2019-10-06 15:43:29
【问题描述】:

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

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

dotnet publish MyProject.csproj -c Release-X

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

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

【问题讨论】:

    标签: .net .net-core msbuild


    【解决方案1】:

    配置值设置为global property,在整个项目图上强制执行,直到项目到项目的引用明确更改此设置。

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

       <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>
      

    【讨论】:

    • 感谢您的回答! #1似乎对我来说很好。从 Visual Studio 构建时,这会覆盖每个引用项目的解决方案配置吗?
    猜你喜欢
    • 1970-01-01
    • 2021-01-09
    • 2018-02-27
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2020-09-18
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多