x64机器上的MSBuild.Community.Tasks.Attrib失败

Sco*_*ott 9 msbuild 64-bit msbuildcommunitytasks

在64位构建计算机上运行时,我遇到了来自MSBuild社区任务项目的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>
Run Code Online (Sandbox Code Playgroud)

当我尝试使用TestAttrib作为目标使用MSBuild构建此项目时,我得到以下结果

C:> msbuild"C:_Source Code\Test.vbproj"/ t:TestAttrib Microsoft(R)Build Engine Version 3.5.30729.1 [Microsoft .NET Framework,Version 2.0.50727.4016] Copyright(C)Microsoft Corporation 2007.保留所有权利.

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 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代码
MSBuildProjectExtension:.vbproj
MSBuildProjectFile:Test.vbproj
MSBuildProjectFullPath:C:_Source Code\Test.vbproj
MSBuildProjectName:Test
MSBuildStartupDirectory:C:\
C:_Source Code\Test.vbproj(26,5):error MSB4062:"MSBuild.Community .Tasks.Attrib"任务无法从程序集C:\ Program Files\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.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) - >(TestAttrib target) - > C:_Source Code\Test.vbproj(26,5):错误MSB4062:"MSBuild.Community.Tasks.无法从程序集C:\ Program Files\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.dll加载Attrib"任务.无法加载文件或程序集'file:/// C:\ Program Files\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.dll'或其依赖项之一.该系统找不到指定的文件.确认声明是否正确,以及程序集及其所有依赖项是否可用.

0 Warning(s)
1 Error(s)
Run Code Online (Sandbox Code Playgroud)

时间流逝00:00:00.05

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

Sco*_*ott 6

我似乎通过编辑"C:\ Program Files(x86)\ MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"的第6行修复了这个问题.
原来它是:

<MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(MSBuildExtensionsPath)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
Run Code Online (Sandbox Code Playgroud)

我把它改成了:

<MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(MSBuildExtensionsPath32)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
Run Code Online (Sandbox Code Playgroud)

注意$(MSBuildExtensionsPath)到$(MSBuildExtensionsPath32)的更改

虽然这似乎已经解决了我的问题,但我不知道为什么我必须首先编辑MSBuild.Community.Tasks.Targets文件 - 我认为安装程序会确保文件是正确的.因此,编辑MSBuild.Community.Tasks.Targets文件可能不是世界上最好的主意,所以如果你决定跟随我的话,要小心.


小智 6

这显然已经太晚了,但我认为如果其他人遇到这个问题,我会加入这个.您可以在构建文件的属性组中定义MSBuildCommunityTasksPath属性,而不是编辑MSBuild.Community.Tasks.Targets文件.例如,我在构建脚本的顶部有这样的东西:

<PropertyGroup>
  <ToolsDirectory>$(MSBuildProjectDirectory)\tools</ToolsDirectory>
  <MSBuildCommunityTasksPath>$(ToolsDirectory)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

然后,我将MSBuildCommunityTasks文件夹存储在源代码管理的工具目录中.这意味着其他人可以在不安装任何东西的情况下直接推出源码并直接构建它.

干杯,亚当