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.
无论如何,我很想知道如何消除这些差异.
例如,它是一个好主意,设置BuildingInsideVisualStudio到true与MSBuild的建设,即使?
有任何想法吗?
PS
我们构建.NET和Silverlight.控制台应用程序,dll和Web应用程序.
.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命令行来完全关闭编译表达式的生成。
您还可以覆盖CoreCompileDependsOn并GenerateCompiledExpressionsTempFile;从中删除该项目。
编辑器内部buildign时出现“特殊行为”,实在是有点可惜。最后,我总是错误地让 Visual Studio 表现得像 MsBuild,而不是相反。许多其他目标将假定特殊服务或主机编译器的可用性(如果确实BuildingInsideVisualStudio如此),让 MsBuild 认为它位于 Visual Studio 内部(而实际上并非如此)似乎是一个非常糟糕的主意。
| 归档时间: |
|
| 查看次数: |
1569 次 |
| 最近记录: |