从 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
,从而触发该项目的后续构建,因为:
- 属性 在相应的
.csproj.user
文件中设置,如果需要,将创建该文件。
.csproj.user
文件是项目依赖项的一部分
所以通过创建它,VS 导致下次构建项目。
想象一下在清理工作区后使用 msbuild 在命令行上构建它,然后切换回 VS 并点击构建按钮。它又在建设中!
- 所以,有这些与工作流相关的愚蠢的自动生成的 CS 文件,它们仅由 VS 生成,而不是由 msbuild(
TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
和朋友)生成 - 我们的 msbuild 故意生成它们以满足 VS。检查。
- 接下来我们确保所有复制到输出目录的文件都使用
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="<?xml version="1.0" encoding="utf-8"?>" />
<CSProjUserContent Include="<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">" />
<CSProjUserContent Include="<PropertyGroup>" />
<CSProjUserContent Include="<LastActiveSolutionConfig>Debug|Any CPU</LastActiveSolutionConfig>" />
<CSProjUserContent Include="</PropertyGroup>" />
<CSProjUserContent Include="</Project>" />
</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" />
VS 2017 为 Web 应用程序的项目加载设置 LastActiveSolutionConfig
,从而触发该项目的后续构建,因为:
- 属性 在相应的
.csproj.user
文件中设置,如果需要,将创建该文件。 .csproj.user
文件是项目依赖项的一部分
所以通过创建它,VS 导致下次构建项目。
想象一下在清理工作区后使用 msbuild 在命令行上构建它,然后切换回 VS 并点击构建按钮。它又在建设中!
- 所以,有这些与工作流相关的愚蠢的自动生成的 CS 文件,它们仅由 VS 生成,而不是由 msbuild(
TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
和朋友)生成 - 我们的 msbuild 故意生成它们以满足 VS。检查。 - 接下来我们确保所有复制到输出目录的文件都使用
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="<?xml version="1.0" encoding="utf-8"?>" />
<CSProjUserContent Include="<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">" />
<CSProjUserContent Include="<PropertyGroup>" />
<CSProjUserContent Include="<LastActiveSolutionConfig>Debug|Any CPU</LastActiveSolutionConfig>" />
<CSProjUserContent Include="</PropertyGroup>" />
<CSProjUserContent Include="</Project>" />
</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" />