在x64机器上,MSBuild.Community.Tasks.Attrib 失败

9

我在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:>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。保留所有权利。
构建开始于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 Code 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:Build MSBuildProjectDirectory:C:_Source Code MSBuildProjectExtension:.vbproj MSBuildProjectFile:Test.vbproj MSBuildProjectFullPath:C:_Source Code\Test.vbproj MSBuildProjectName:Test MSBuildStartupDirectory:C:\ C:_Source Code\Test.vbproj(26,5):错误MSB4062:无法从程序集C:\Program Files\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.dll中加载“MSBuild.Community.Tasks.Attrib”任务。无法加载文件或程序集'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)->(TestAttrib target) -> C:_Source Code\Test.vbproj(26,5):错误MSB4062:无法从程序集C:\Program Files\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.dll中加载“MSBuild.Community.Tasks.Attrib”任务。无法加载文件或程序集'file:///C:\Program Files\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.dll'或其中的一个依赖项。系统找不到指定的文件。请确认声明正确,并且程序集及其所有依赖项都可用。
0 Warning(s)
1 Error(s)

已用时间 00:00:00.05

为什么 MSBuild 在我明确使用 (MSBuildExtensionsPath32) 变量导入任务时,仍在 C:\Program Files\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.dll 中搜索 Attrib 任务?

3个回答

6
这显然是一个过晚的答案,但我想为此添加一些内容,以防其他人遇到这个问题。您可以在构建文件中的属性组中定义MSBuildCommunityTasksPath属性,而不是编辑MSBuild.Community.Tasks.Targets文件。例如,我在我的构建脚本顶部有以下内容:
<PropertyGroup>
  <ToolsDirectory>$(MSBuildProjectDirectory)\tools</ToolsDirectory>
  <MSBuildCommunityTasksPath>$(ToolsDirectory)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
</PropertyGroup>

我将MSBuildCommunityTasks文件夹存储在源代码控制的工具目录中。这意味着其他人可以直接提取源代码并构建,而无需安装任何东西。
祝好, 亚当

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文件并不是世界上最好的主意,如果您决定跟随我的步伐,请小心。


这份帮助文档已经非常过时了。自从这个问题被提出以来,MS Build流程已经发生了变化,最好按照这里的说明进行操作:https://github.com/loresoft/msbuildtasks对于我的项目,我在解决方案中使用了一个Build文件夹,并在解决方案中创建了一个MSBuildTasks文件夹,在其中复制了最新的MBBuild.Community.Task文件(在Zip文件发布中)。然后,我引用了我创建的文件夹中的文件。 - PBo

0

这份帮助已经非常过时了。自从这个问题被提出以来,MS Build流程已经发生了变化,最好按照这里的说明进行操作https://github.com/loresoft/msbuildtasks

对于我的项目,我在解决方案中使用了一个Build文件夹,并在解决方案中创建了一个MSBuildTasks文件夹,在其中复制了最新的MBBuild.Community.Task文件(在Zip文件发布中),并在我的msbuild文件中添加了以下行:

   <PropertyGroup>
     <MSBuildCommunityTasksPath>.\MSBuildTasks</MSBuildCommunityTasksPath>
   </PropertyGroup>  

  <Import Project=".\MSBuildTasks\MSBuild.Community.Tasks.Targets" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接