TFS 2017 - 错误 MSB4126:指定的解决方案配置 "dev|any cpu" 无效

TFS 2017 - Error MSB4126: The specified solution configuration "dev|any cpu" is invalid

这个问题似乎很普遍,但我还没有找到一致的解决方案。

我正在使用 VS2017 和 TFS2017 构建一整套 4.6.1 class 库 - 有些是 nugets,有些是插件 - 我无法构建其中一个项目,尽管使用与之前所有项目相同的方法。

我们使用 "Any CPU" 平台和 "dev"、"test"、"train" 或 "prod" 的配置构建我们所有的项目 - 这工作正常多年来使用 TFS2013,到目前为止至少有 30 个项目迁移到 2017 构建系统。

然而,在一个非常简单的项目中,我不断收到错误...

Error MSB4126: The specified solution configuration "dev|any cpu" is invalid.

尽管配置和平台作为 "dev" & "any cpu" 从构建中正确传递,并且解决方案和项目文件都设置了正确的配置...

sln:

Microsoft Visual Studio Solution File, Format Version 12.00
Visual Studio 15
VisualStudioVersion = 15.0.27703.2042
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MailMessageSerialisation", "MailMessageSerialisation\MailMessageSerialisation.csproj", "{9D787499-7DBB-4760-8923-C86FD13C4394}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        dev|Any CPU = dev|Any CPU
        prod|Any CPU = prod|Any CPU
        test|Any CPU = test|Any CPU
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {9D787499-7DBB-4760-8923-C86FD13C4394}.dev|Any CPU.ActiveCfg = dev|Any CPU
        {9D787499-7DBB-4760-8923-C86FD13C4394}.dev|Any CPU.Build.0 = dev|Any CPU
        {9D787499-7DBB-4760-8923-C86FD13C4394}.prod|Any CPU.ActiveCfg = prod|Any CPU
        {9D787499-7DBB-4760-8923-C86FD13C4394}.prod|Any CPU.Build.0 = prod|Any CPU
        {9D787499-7DBB-4760-8923-C86FD13C4394}.test|Any CPU.ActiveCfg = test|Any CPU
        {9D787499-7DBB-4760-8923-C86FD13C4394}.test|Any CPU.Build.0 = test|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {2C7FB0D0-7327-4D21-9A11-0B34AC019E68}
    EndGlobalSection
    GlobalSection(TeamFoundationVersionControl) = preSolution
        SccNumberOfProjects = 2
        SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
        SccTeamFoundationServer = http://XXXXXXXXX:8080/tfs/infrastructure
        SccLocalPath0 = .
        SccProjectUniqueName1 = MailMessageSerialisation\MailMessageSerialisation.csproj
        SccProjectName1 = MailMessageSerialisation
        SccLocalPath1 = MailMessageSerialisation
    EndGlobalSection
EndGlobal

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" Condition="Exists('$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">dev</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{9D787499-7DBB-4760-8923-C86FD13C4394}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>MailMessageSerialisation</RootNamespace>
    <AssemblyName>MailMessageSerialisation</AssemblyName>
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <TargetFrameworkProfile />
    <SccProjectName>SAK</SccProjectName>
    <SccLocalPath>SAK</SccLocalPath>
    <SccAuxPath>SAK</SccAuxPath>
    <SccProvider>SAK</SccProvider>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'dev|AnyCPU'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\dev\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>
    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'test|AnyCPU'">
    <OutputPath>bin\test\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <Optimize>true</Optimize>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>
    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'prod|AnyCPU'">
    <OutputPath>bin\prod\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <Optimize>true</Optimize>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>
    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
  </PropertyGroup>
  <!--
snip
  -->
</Project>

构建输出的构建求解步骤:

    ******************************************************************************
Starting: Build solution **\*.sln
******************************************************************************
==============================================================================
Task         : Visual Studio Build
Description  : Build with MSBuild and set the Visual Studio version property
Version      : 1.119.0
Author       : Microsoft Corporation
Help         : [More Information](https://go.microsoft.com/fwlink/?LinkID=613727)
==============================================================================
"E:\ci\builds\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-affca411ecda.119.0\ps_modules\MSBuildHelpers\vswhere.exe" -version [15.0,16.0) -latest -format json
"C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\MSBuild.0\Bin\msbuild.exe" "e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation.sln" /nologo /nr:false /dl:CentralLogger,"E:\ci\builds\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-affca411ecda.119.0\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll";"RootDetailId=8659b024-ac52-47a4-a6ab-1be44fd5e1f8|SolutionDir=e:\ci\builds\s\MailMessageSerialisation\dev"*ForwardingLogger,"E:\ci\builds\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-affca411ecda.119.0\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll" /p:platform="any cpu" /p:configuration="dev" /p:VisualStudioVersion="15.0" /p:_MSDeployUserAgent="TFS_620f346c-98e2-4693-ab12-3a966e56835f_build_66_333"
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
Build started 30/07/2018 3:34:36 PM.
Project "e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation.sln" on node 1 (default targets).
ValidateSolutionConfiguration:
  Building solution configuration "dev|any cpu".
Project "e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation.sln" (1) is building "e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.csproj" (2) on node 1 (default targets).
PrepareForBuild:
  Creating directory "bin\dev\".
  Creating directory "obj\dev\".
CoreCompile:
  C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\MSBuild.0\Bin\Roslyn\csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /platform:AnyCPU /errorreport:prompt /define:DEBUG;TRACE /highentropyva+ /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\Microsoft.CSharp.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll" /reference:e:\ci\builds\s\MailMessageSerialisation\dev\packages\S22.SerializableMailMessage.1.0.5742.24665\lib\net46\S22.Mail.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Core.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.dll" /debug+ /debug:full /filealign:512 /out:obj\dev\MailMessageSerialisation.dll /ruleset:"C:\Program Files (x86)\Micros...
  Using shared compilation with compiler from directory: C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\MSBuild.0\Bin\Roslyn
_CopyFilesMarkedCopyLocal:
  Copying file from "e:\ci\builds\s\MailMessageSerialisation\dev\packages\S22.SerializableMailMessage.1.0.5742.24665\lib\net46\S22.Mail.dll" to "bin\dev\S22.Mail.dll".
  Creating "e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\obj\dev\MailMessageSerialisation.csproj.CopyComplete" because "AlwaysCreate" was specified.
CopyFilesToOutputDirectory:
  Copying file from "obj\dev\MailMessageSerialisation.dll" to "bin\dev\MailMessageSerialisation.dll".
  MailMessageSerialisation -> e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\bin\dev\MailMessageSerialisation.dll
  Copying file from "obj\dev\MailMessageSerialisation.pdb" to "bin\dev\MailMessageSerialisation.pdb".
Done Building Project "e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.csproj" (default targets).
Done Building Project "e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation.sln" (default targets).
Build succeeded.
    0 Warning(s)
    0 Error(s)
Time Elapsed 00:00:01.28
"C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\MSBuild.0\Bin\msbuild.exe" "e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.sln" /nologo /nr:false /dl:CentralLogger,"E:\ci\builds\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-affca411ecda.119.0\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll";"RootDetailId=52be2739-dbca-4b96-a2a2-1bbd66410e14|SolutionDir=e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation"*ForwardingLogger,"E:\ci\builds\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-affca411ecda.119.0\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll" /p:platform="any cpu" /p:configuration="dev" /p:VisualStudioVersion="15.0" /p:_MSDeployUserAgent="TFS_620f346c-98e2-4693-ab12-3a966e56835f_build_66_333"
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
Build started 30/07/2018 3:34:38 PM.
e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.sln.metaproj(0,0): Error MSB4126: The specified solution configuration "dev|any cpu" is invalid. Please specify a valid solution configuration using the Configuration and Platform properties (e.g. MSBuild.exe Solution.sln /p:Configuration=Debug /p:Platform="Any CPU") or leave those properties blank to use the default solution configuration.
Project "e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.sln" on node 1 (default targets).
e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.sln.metaproj : error MSB4126: The specified solution configuration "dev|any cpu" is invalid. Please specify a valid solution configuration using the Configuration and Platform properties (e.g. MSBuild.exe Solution.sln /p:Configuration=Debug /p:Platform="Any CPU") or leave those properties blank to use the default solution configuration. [e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.sln]
Done Building Project "e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.sln" (default targets) -- FAILED.
Build FAILED.
"e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.sln" (default target) (1) ->
(ValidateSolutionConfiguration target) -> 
  e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.sln.metaproj : error MSB4126: The specified solution configuration "dev|any cpu" is invalid. Please specify a valid solution configuration using the Configuration and Platform properties (e.g. MSBuild.exe Solution.sln /p:Configuration=Debug /p:Platform="Any CPU") or leave those properties blank to use the default solution configuration. [e:\ci\builds\s\MailMessageSerialisation\dev\MailMessageSerialisation\MailMessageSerialisation.sln]
    0 Warning(s)
    1 Error(s)
Time Elapsed 00:00:00.15
Process 'msbuild.exe' exited with code '1'.
******************************************************************************
Finishing: Build solution **\*.sln
******************************************************************************

如您所见,项目和解决方案中都有一个 "dev|any cpu" 配置,并且告诉构建使用这些设置...

... /p:platform="any cpu" /p:configuration="dev" ...

我试过重新创建解决方案文件,对参数使用不同的大小写,跳过一个(不起作用),跳过两个(有效但不允许根据目标环境更改配置) ,我尝试在构建定义步骤中直接输入参数,也尝试通过构建变量输入参数,但都无济于事。

大约一周前,我曾在另一个项目中遇到过这种情况,当时只能通过从 TFS 中完全删除项目并完全重建项目和解决方案(仅保留 class 原始文件)并最终重建构建 - 然后问题就消失了!我假设某处发生腐败,但现在又发生了...

我无法在此处 post 完整的构建步骤日志,它太大了,但我已经这样做了数十次,无法理解为什么这个项目与其他项目有任何不同性质非常相似,所有这些都在构建定义中使用相同的 solution/project 结构和相同的步骤和参数,并且所有这些都有效。

我不想每次遇到这个问题时都必须重建整个项目、解决方案和构建定义 - 我还有一大堆其他项目要在 2013 年过渡,其中一些要复杂得多。

想法?建议? (拜托!)

编辑: 为简单起见,我从解决方案中排除了单元测试项目。只是将它重新添加以进行进一步测试,我发现它构建得很好,尽管与原始库项目相比配置相同!嗯...

编辑2: 简单地添加另一个构建定义(从头开始构建,而不是克隆)并不能解决问题,它似乎是集合中项目的一个属性。已向 MS 提出高级支持案例。

编辑3: 我已经确认这不是代码问题。我复制了一个 "broken" 项目的文件结构,在集合中创建了一个新项目并导入了代码,然后再次手工制作构建 - 与损坏的相同 - 并构建了项目!

我相信我也可以排除我添加到 TFS 的 Export/Import 构建定义扩展。我导出了一个损坏的构建定义,仅更改了 JSON 中的名称并将其导入到新项目中 - 它成功了!

问题是 2017 年构建系统的更改与 XAML 构建以及开发人员(应保持匿名)的一点点 laziness/untidiness 相结合。

在正常情况下,在 TFS 中我们有...

<project name>
    \dev
        \project 0
        \project 1
        \etc.

创建第一个项目时,VS 会自动在与项目相同的文件夹中创建一个解决方案文件。如果这是 moved/saved 到 dev 文件夹之前第一次签入,所有人都会对这个世界感到高兴。

不幸的是,在将项目保存到 TFS 之前,这种情况不会经常发生,所以我们得到...

<project name>
    \dev
        \project0
            project.sln
            project0.csproj
        \project1
            project1.csproj
        \etc.

一旦发现错误,开发人员将.sln文件重新保存到dev文件夹并签入-项目中现在有两个解决方案文件,但第二个很少见,被遗忘了。

<project name>
    \dev
        project.sln
        \project0
            project.sln    <- Problem!
            project0.csproj
        \project1
            project1.csproj
        \etc.

如果项目是从源代码管理打开的,则不会下载第二个 .sln,这就是将代码复制到新位置的原因 - 通过打开解决方案并仅下载有效内容来清理代码.

新的构建系统下载整个开发分支并且构建步骤被告知(默认情况下)构建 **\*.sln - 它会找到两个解决方案文件。顺便说一句,旧的 XAML 构建系统指定了一个正确的 .sln 文件的路径,因此问题并没有显现出来。

如果在移动 .sln 文件之前设置了 dev、test、train 和 prod 的配置管理器设置,则第二个解决方案将包含正确的值并愉快地构建,只是稍微减慢了构建步骤。但是,如果它仍然只包含 Debug 和 Release,则这与参数不匹配并且构建失败。

感谢 Microsoft Premium Support 的 Martin 仔细研究了一些重要的日志并在大海捞针中找到了这根小针。