从 msbuild 控制台构建切换到 IDE(第一次)时,VS 2017 会冗余构建代码

VS 2017 builds code redundantly when switching from msbuild console build over to IDE (the first time)

VS 2017 为 Web 应用程序的项目加载设置 LastActiveSolutionConfig,从而触发该项目的后续构建,因为:

所以通过创建它,VS 导致下次构建项目。

想象一下在清理工作区后使用 msbuild 在命令行上构建它,然后切换回 VS 并点击构建按钮。它又在建设中!

  1. 所以,有这些与工作流相关的愚蠢的自动生成的 CS 文件,它们仅由 VS 生成,而不是由 msbuild(TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs 和朋友)生成 - 我们的 msbuild 故意生成它们以满足 VS。检查。
  2. 接下来我们确保所有复制到输出目录的文件都使用 PreserveNewest - 检查。

我已经忘记了我们还必须做些什么来确保 VS 在从 msbuild 切换到 IDE 时不会冗余地重建代码。现在这个,是新的。

如何防止 VS 2017 添加这个 属性?绝对有必要拥有吗?

与此同时,我将通过添加它来修改 .csproj 文件,看看是否有帮助。没有人在我们这里本地构建 Release,它始终是 AnyCPU 平台,所以我不关心其他配置,除了 Debug|AnyCPU.

这就是我要做的:

  • 将构建详细程度设置为诊断。
  • 构建并查找生成此文件的 msbuild 文件所在的位置: TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
  • 寻找一些您可以更改的条件以防止文件被 产生。
  • 设置一些 属性 来改变条件并防止生成该文件。

我的解决方案是生成 .csproj.user 文件(如果需要)和预期的 属性。一个人必须这样做是非常烦人的。这是可以进入您的 Directory.Build.Targets:

的构建代码
  <Target Name="EnsureCSProjUserForWebApplications" 
          Condition="'$(IsWebApplication)' == True And !Exists('$(MSBuildProjectFullPath).user')">
    <ItemGroup>
      <CSProjUserContent Include="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;" />
      <CSProjUserContent Include="&lt;Project ToolsVersion=&quot;15.0&quot; xmlns=&quot;http://schemas.microsoft.com/developer/msbuild/2003&quot;&gt;" />
      <CSProjUserContent Include="&lt;PropertyGroup&gt;" />
      <CSProjUserContent Include="&lt;LastActiveSolutionConfig&gt;Debug|Any CPU&lt;/LastActiveSolutionConfig&gt;" />
      <CSProjUserContent Include="&lt;/PropertyGroup&gt;" />
      <CSProjUserContent Include="&lt;/Project&gt;" />
    </ItemGroup>
    <WriteLinesToFile File="$(MSBuildProjectFullPath).user" Lines="@(CSProjUserContent)" ContinueOnError="true" />
  </Target>

IsWebApplication 是这样计算的:

<IsWebApplication>$(ProjectTypeGuids.Contains('349c5851-65df-11da-9384-00065b846f21'))</IsWebApplication>

最后,目标是更大系列目标的一部分,这些目标在开始时 运行 并验证 csproj 是否符合我们的要求或确保某些条件:

  <PropertyGroup>
    <EnsureXyzProjectSettingsDependsOn>
      AssertIISExpress;
      AssertNoAssemblyInfo;
      AssertDebugSymbols;
      AssertLocalApplicationHostFile;
      AssertImportsDFVersioning;
      EnsureSharedBinLink;
      AssertSharedBinOutputPath;
      AssertHintPaths;
      EnsureCSProjUserForWebApplications
    </EnsureXyzProjectSettingsDependsOn>
  </PropertyGroup>

  <Target Name="EnsureXyzProjectSettings" 
          DependsOnTargets="$(EnsureXyzProjectSettingsDependsOn)" 
          BeforeTargets="BeforeBuild" 
          Condition="'$(SuppressStrictXyzTargetsChecks)' != true" />