9

在 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>

当我尝试使用 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] 版权所有 (C) Microsoft Corporation 2007。保留所有权利.

构建开始于 2009 年 7 月 9 日下午 2:50:12。
节点 0(TestAttrib 目标)上的项目“C:_Source Code\Test.vbproj”。
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: 构建
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: The "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 目标)——失败。

构建失败。

“C:_Source Code\Test.vbproj”(TestAttrib 目标)(1)->(TestAttrib 目标)-> C:_Source Code\Test.vbproj(26,5):错误 MSB4062:“MSBuild.Community.Tasks. Attrib”任务无法从程序集 C:\Program Files\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.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 任务?

4

3 回答 3

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

于 2009-09-07T07:02:25.580 回答
6

这显然为时已晚,但我想我会补充一下,以防其他人遇到这个问题。无需编辑 MSBuild.Community.Tasks.Targets 文件,您只需在构建文件的属性组中定义 MSBuildCommunityTasksPath 属性。例如,我的构建脚本顶部有这样的内容:

<PropertyGroup>
  <ToolsDirectory>$(MSBuildProjectDirectory)\tools</ToolsDirectory>
  <MSBuildCommunityTasksPath>$(ToolsDirectory)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
</PropertyGroup>

然后,我将 MSBuildCommunityTasks 文件夹存储在源代码管理的工具目录中。这意味着其他人可以提取源代码并立即构建它而无需安装任何东西。

干杯,亚当

于 2011-10-09T23:40:32.657 回答
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" />
于 2019-03-28T16:36:01.020 回答