使用msbuild和devenv交换构建相同的解决方案

mar*_*ark 6 msbuild visual-studio visual-studio-2012

我经常使用msbuild在命令行上构建一些解决方案,运行它一段时间,然后发现我需要更改和调试它.因此,我在Visual Studio中打开它,最终在Visual Studio中构建它.

即使我什么都没改变,VS会重建解决方案的很多部分!

深入研究以下内容:

在Visual Studio中构建生成空cs文件并将它们注入Compile项目组.当然,它们比已经构建的二进制文件更新,因此devenv.exe重建了大量项目.感谢TemporaryGeneratedFile_ [guid] in/obj/debug break build

这是一个真正的无赖.我通过重命名Microsoft.WorkflowBuildExtensions.targets文件禁用了这种行为- 我不做工作流程.

我想我可以攻击CoreCompileDependsOn并以某种方式GenerateCompiledExpressionsTempFile从Microsoft.WorkflowBuildExtensions.targets 中和目标,但这必须在190个项目中完成!这是一个严重的变化.

devenv.exe似乎关心一些文件总是被复制到输出目录,即使msbuild认为它不是问题.

实际上,这是devenv.exe构建日志中的一行:

Project 'HRCore.Tests' is not up to date. Project item 'C:\abc\UI\HRCore.Tests\HRImport\Import_missing_state_county.xml' has 'Copy to Output Directory' attribute set to 'Copy always'.
Run Code Online (Sandbox Code Playgroud)

所以呢?msbuild并不关心它,但devenv确实如此.这个文件不是HRCore.Tests和msbuild 的依赖关系.

与此同时,我将其Always改为PreserveNewest.

无论如何,我很想知道如何消除这些差异.

例如,它是一个好主意,设置BuildingInsideVisualStudiotrue与MSBuild的建设,即使?

有任何想法吗?

PS

我们构建.NET和Silverlight.控制台应用程序,dll和Web应用程序.

jes*_*ing 2

.targets由于显式检查,该文件确实会导致 Visual Studio 和命令行 MsBuild 之间出现不同的行为$(BuildingInsideVisualStudio)

  <PropertyGroup>
    <PrepareResourcesDependsOn>
      ValidationExtension;
      ExpressionBuildExtension;
      $(PrepareResourcesDependsOn)
    </PrepareResourcesDependsOn>
  </PropertyGroup>

  <PropertyGroup>
    <!-- Explicit check for Visual Studio here -->
    <CoreCompileDependsOn Condition="'$(BuildingInsideVisualStudio)' == 'true'">
        GenerateCompiledExpressionsTempFile;
        $(CoreCompileDependsOn)
    </CoreCompileDependsOn>   
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

该显式检查使得临时文件生成发生在我的配置中的 Visual Studio 中。制作这些文件是为了让您在 Visual Studio 中运行时可以单步进入并调试它们。

可以通过在项目文件中覆盖为空来关闭该行为 <GenerateCompiledExpressionsTempFilePathForEditing />,并在命令行上显式清除其值。

/p:GenerateCompiledExpressionsTempFilePathForEditing=''
Run Code Online (Sandbox Code Playgroud)

这是保护此行为的条件:

 <Target Name ="GenerateCompiledExpressionsTempFile" 
      Condition = "'$(GenerateCompiledExpressionsTempFilePathForEditing)' != ''">  
Run Code Online (Sandbox Code Playgroud)

查看 MsBuild 路径,您应该能够通过传递/p:DisableWorkflowCompiledExpression=true命令行来完全关闭编译表达式的生成。

您还可以覆盖CoreCompileDependsOnGenerateCompiledExpressionsTempFile;从中删除该项目。

编辑器内部buildign时出现“特殊行为”,实在是有点可惜。最后,我总是错误地让 Visual Studio 表现得像 MsBuild,而不是相反。许多其他目标将假定特殊服务或主机编译器的可用性(如果确实BuildingInsideVisualStudio如此),让 MsBuild 认为它位于 Visual Studio 内部(而实际上并非如此)似乎是一个非常糟糕的主意。