在64位构建计算机上运行时,MSBuild Community Tasks Project的Attrib任务出现问题。
我把这个小测试项目放在一起,以显示问题所在:
<Project ToolsVersion="3.5" DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath32)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<Target Name="PrintProperties">
<Message Text="MSBuildCommunityTasksPath: $(MSBuildCommunityTasksPath)"/>
<Message Text="MSBuildCommunityTasksLib: $(MSBuildCommunityTasksLib)"/>
<Message Text="MSBuildNodeCount: $(MSBuildNodeCount)"/>
<Message Text="MSBuildExtensionsPath: $(MSBuildExtensionsPath)"/>
<Message Text="MSBuildExtensionsPath32: $(MSBuildExtensionsPath32)"/>
<Message Text="MSBuildProjectDirectoryNoRoot: $(MSBuildProjectDirectoryNoRoot)"/>
<Message Text="MSBuildToolsPath: $(MSBuildToolsPath)"/>
<Message Text="MSBuildToolsVersion: $(MSBuildToolsVersion)"/>
<Message Text="MSBuildBinPath: $(MSBuildBinPath)"/>
<Message Text="MSBuildExtensionsPath: $(MSBuildExtensionsPath)"/>
<Message Text="MSBuildProjectDefaultTargets: $(MSBuildProjectDefaultTargets)"/>
<Message Text="MSBuildProjectDirectory: $(MSBuildProjectDirectory)"/>
<Message Text="MSBuildProjectExtension: $(MSBuildProjectExtension)"/>
<Message Text="MSBuildProjectFile: $(MSBuildProjectFile)"/>
<Message Text="MSBuildProjectFullPath: $(MSBuildProjectFullPath)"/>
<Message Text="MSBuildProjectName: $(MSBuildProjectName)"/>
<Message Text="MSBuildStartupDirectory: $(MSBuildStartupDirectory)"/>
</Target>
<Target Name="TestAttrib" DependsOnTargets="PrintProperties">
<Attrib Files="Test.txt" ReadOnly="false" />
</Target>
</Project>
当我尝试使用TestAttrib作为目标使用MSBuild构建此项目时,我得到以下结果
C:&gt; msbuild“C:_Source Code \ Test.vbproj”/ t:TestAttrib Microsoft(R)Build Engine版本3.5.30729.1 [Microsoft .NET Framework,版本2.0.50727.4016] 版权所有(C)Microsoft Corporation 2007.保留所有权利。
Build build 7/09/2009 2:50:12 PM
节点0上的项目“C:_Source Code \ Test.vbproj”(TestAttrib target(s))。
MSBuildCommunityTasksLib:C:\ Program Files \ MSBuild \ MSBuildCommunityTasks \ MSBu
ild.Community.Tasks.dll
MSBuildNodeCount:1
MSBuildExtensionsPath:C:\ Program Files \ MSBuild
MSBuildExtensionsPath32:C:\ Program Files(x86)\ MSBuild
MSBuildProjectDirectoryNoRoot:_Source代码
MSBuildToolsPath:c:\ Windows \ Microsoft.NET \ Framework64 \ v3.5
MSBuildToolsVersion:3.5
MSBuildBinPath:c:\ Windows \ Microsoft.NET \ Framework64 \ v3.5
MSBuildExtensionsPath:C:\ Program Files \ MSBuild
MSBuildProjectDefaultTargets:构建
MSBuildProjectDirectory:C:_Source代码
MSBuildProjectExtension:.vbproj
MSBuildProjectFile:Test.vbproj
MSBuildProjectFullPath:C:_Source Code \ Test.vbproj
MSBuildProjectName:测试
MSBuildStartupDirectory:C:\
C:_Source Code \ Test.vbproj(26,5):错误MSB4062:无法从程序集C:\ Program Files \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks加载“MSBuild.Community.Tasks.Attrib”任务.dll文件。无法加载文件或程序集'file:/// C:\ Program Files \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks.dll'或其依赖项之一。该系统找不到指定的文件。确认声明是否正确,以及程序集及其所有依赖项是否可用。
完成建筑项目“C:_Source Code \ Test.vbproj”(TestAttrib target(s)) - FAILED。
构建失败。
“C:_Source Code \ Test.vbproj”(TestAttrib target)(1) - &gt;(TestAttrib target) - &gt; C:_Source Code \ Test.vbproj(26,5):错误MSB4062:无法从程序集C:\ Program Files \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks加载“MSBuild.Community.Tasks.Attrib”任务.dll文件。无法加载文件或程序集'file:/// C:\ Program Files \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks.dll'或其依赖项之一。该系统找不到指定的文件。确认声明是正确的,并且程序集及其所有依赖项都可用。
0 Warning(s)
1 Error(s)
时间流逝00:00:00.05
为什么当我使用(MSBuildExtensionsPath32)变量显式导入任务时,MSBuild在C:\ Program Files \ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks.dll中搜索Attrib任务?
答案 0 :(得分:6)
我似乎通过编辑“C:\ Program Files(x86)\ MSBuild \ MSBuildCommunityTasks \ MSBuild.Community.Tasks.Targets”的第6行修复了该问题。
最初它是:
<MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(MSBuildExtensionsPath)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
我将其改为:
<MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(MSBuildExtensionsPath32)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
请注意$(MSBuildExtensionsPath)更改为$(MSBuildExtensionsPath32)
虽然这似乎已经解决了我的问题,但我不知道为什么我必须首先编辑MSBuild.Community.Tasks.Targets文件 - 我认为安装程序会确保文件是正确。因此,编辑MSBuild.Community.Tasks.Targets文件可能不是世界上最好的想法,所以如果你决定跟随我的话,要小心。
答案 1 :(得分:6)
这显然已经太迟了回答,但我认为如果其他人遇到这个问题,我会加上这个。您可以在构建文件的属性组中定义MSBuildCommunityTasksPath属性,而不是编辑MSBuild.Community.Tasks.Targets文件。例如,我在构建脚本的顶部有类似的东西:
<PropertyGroup>
<ToolsDirectory>$(MSBuildProjectDirectory)\tools</ToolsDirectory>
<MSBuildCommunityTasksPath>$(ToolsDirectory)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
</PropertyGroup>
然后,我将MSBuildCommunityTasks文件夹存储在源代码管理的工具目录中。这意味着其他人可以在没有安装任何东西的情况下直接推出光源并直接构建它。
干杯, 亚当
答案 2 :(得分:0)
这是非常过时的帮助。此票证以来,ms生成过程已更改,最好遵循此处的说明https://github.com/loresoft/msbuildtasks
对于我的项目,我在解决方案中使用了一个Build文件夹,在该解决方案中,我创建了一个MSBuildTasks文件夹,在其中复制了Zip文件版本中的最新MBBuild.Community.Task文件。并将以下行放入我的msbuild文件中
<PropertyGroup>
<MSBuildCommunityTasksPath>.\MSBuildTasks</MSBuildCommunityTasksPath>
</PropertyGroup>
<Import Project=".\MSBuildTasks\MSBuild.Community.Tasks.Targets" />