เหตุใด msbuild จึงคอมไพล์ทั้งใน Debug และ Release เมื่อมีการร้องขอเฉพาะ Release ในบางสถานการณ์

ฉันกำลังสร้างโซลูชันสองรายการในการกำหนดค่า Release อย่างไรก็ตาม โซลูชันที่สองจะสร้างบางโปรเจ็กต์ใหม่ใน Debug!

ฉันสามารถลดกรณีทดสอบให้เหลือน้อยที่สุดได้ ประกอบด้วย 4 ไฟล์ - 2 ไฟล์ sln และ 2 ไฟล์ csproj

พวกเขาอยู่ที่นี่:

DataSvc.sln


Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28010.2048
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{04455D86-A7A4-41E5-B3ED-B0BC65EAFDFD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compensation.Data", "Compensation.Data\Compensation.Data.csproj", "{04DF77A2-912B-40B7-B398-E9558519CAEE}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {04455D86-A7A4-41E5-B3ED-B0BC65EAFDFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {04455D86-A7A4-41E5-B3ED-B0BC65EAFDFD}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {04455D86-A7A4-41E5-B3ED-B0BC65EAFDFD}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {04455D86-A7A4-41E5-B3ED-B0BC65EAFDFD}.Release|Any CPU.Build.0 = Release|Any CPU
        {04DF77A2-912B-40B7-B398-E9558519CAEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {04DF77A2-912B-40B7-B398-E9558519CAEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {04DF77A2-912B-40B7-B398-E9558519CAEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {04DF77A2-912B-40B7-B398-E9558519CAEE}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {9ED7ECEC-075D-486A-B3F6-9E80EED49AEF}
    EndGlobalSection
EndGlobal

Main.sln

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28010.2026
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compensation.Data", "Compensation.Data\Compensation.Data.csproj", "{04DF77A2-912B-40B7-B398-E9558519CAEE}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {04DF77A2-912B-40B7-B398-E9558519CAEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {04DF77A2-912B-40B7-B398-E9558519CAEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {04DF77A2-912B-40B7-B398-E9558519CAEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {04DF77A2-912B-40B7-B398-E9558519CAEE}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {6FBE2C7C-DCEA-4F88-BF8E-FF4927DEFBE5}
    EndGlobalSection
EndGlobal

ทั่วไป\Common.csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{04455D86-A7A4-41E5-B3ED-B0BC65EAFDFD}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Xyz.Common</RootNamespace>
    <AssemblyName>Xyz.Common</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <OutputPath>Bin\$(Configuration)</OutputPath>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DefineConstants>DEBUG;TRACE</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DefineConstants>TRACE</DefineConstants>
  </PropertyGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

การชดเชย.Data.csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{04DF77A2-912B-40B7-B398-E9558519CAEE}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Compensation.Data</RootNamespace>
    <AssemblyName>Compensation.Data</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
    <OutputPath>Bin\$(Configuration)</OutputPath>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DefineConstants>DEBUG;TRACE</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DefineConstants>TRACE</DefineConstants>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\Common\Common.csproj">
      <Project>{04455d86-a7a4-41e5-b3ed-b0bc65eafdfd}</Project>
      <Name>Common</Name>
    </ProjectReference>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

สิ่งที่ควรทราบ:

  1. โหลดโครงการ Compensation.Data ทั้งใน DataSvc.sln และ Main.sln
  2. โปรเจ็กต์ Compensation.Data อ้างอิงโปรเจ็กต์ Common ว่าเป็นโปรเจ็กต์ ไม่ใช่ DLL แม้ว่าจะไม่พบใน Main.sln

ปัญหา - เมื่อรวบรวมโซลูชันทั้งสองใน Release Main.sln จะสร้าง Common ใน Debug!

กรุณาสังเกต:

C:\work\MSBuildBug [master]> git clean -qdfX
C:\work\MSBuildBug [master]> Test-Path .\Common\bin\Debug
False
C:\work\MSBuildBug [master]> msbuild .\DataSvc.sln /v:m /nowarn:CS2008 /nologo /p:Configuration=Release
  Common -> C:\work\MSBuildBug\Common\Bin\Release\Xyz.Common.dll
  Compensation.Data -> C:\work\MSBuildBug\Compensation.Data\Bin\Release\Compensation.Data.dll
C:\work\MSBuildBug [master]> Test-Path .\Common\bin\Debug
False
C:\work\MSBuildBug [master]> msbuild .\Main.sln /v:m /nowarn:CS2008 /nologo /p:Configuration=Release
  Common -> C:\work\MSBuildBug\Common\Bin\Debug\Xyz.Common.dll
  Compensation.Data -> C:\work\MSBuildBug\Compensation.Data\Bin\Release\Compensation.Data.dll
C:\work\MSBuildBug [master]> Test-Path .\Common\bin\Debug
True
C:\work\MSBuildBug [master]> dir .\Common\bin\Debug


    Directory: C:\work\MSBuildBug\Common\bin\Debug


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2/18/2020   1:24 AM           3584 Xyz.Common.dll
-a----        2/18/2020   1:24 AM           7680 Xyz.Common.pdb


C:\work\MSBuildBug [master]>

วิธีนี้ใช้ได้ผลทั้งใน VS 2017 และ VS 2019

ฉันพลาดอะไรไปที่นี่? ทำไมมันถึงคอมไพล์ใน Debug เลย?


person mark    schedule 18.02.2020    source แหล่งที่มา
comment
Main.sln มีเพียง Compensation.Data โครงการ แต่มีการอ้างอิงโครงการ Common คุณได้ลองเพิ่ม Common ถึง Main.sln ด้วยหรือไม่   -  person Pavel Anikhouski    schedule 18.02.2020
comment
ฉันค่อนข้างแน่ใจว่ามันจะได้ผล แต่กรณีการใช้งานของฉันแตกต่างออกไป โซลูชันจริงมีประมาณ 100 โปรเจ็กต์และบางส่วนอ้างอิงถึงโปรเจ็กต์อื่นนอกเหนือจากโซลูชัน ฉันไม่เข้าใจว่าทำไมสถานการณ์นี้จึงไม่ทำงาน   -  person mark    schedule 18.02.2020


คำตอบ (1)


คำตอบอยู่ที่นี่ - https://github.com/microsoft/msbuild/issues/5116#issuecomment-584211463

การตั้งค่านี้ (เช่นใน Directory.Build.props) จะช่วยแก้ปัญหาได้:

<ShouldUnsetParentConfigurationAndPlatform>false</ShouldUnsetParentConfigurationAndPlatform>
person mark    schedule 02.03.2020