为什么我的自定义CodeTaskFactory任务在Visual Studio 2013中失败但是从命令行工作?

时间:2014-07-03 12:20:22

标签: msbuild visual-studio-2013

我已按照this answer中的指南

将以下自定义任务添加到我的项目文件中
<UsingTask
    TaskName="SetEnvironmentVariable"
    TaskFactory="CodeTaskFactory"
  AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll">

    <ParameterGroup>
        <Name/>
        <Value/>
    </ParameterGroup>
    <Task>
      <Using Namespace="System" />
      <Code Type="Fragment" Language="cs">
        <![CDATA[
        Environment.SetEnvironmentVariable(Name, Value);
      ]]>
      </Code>
    </Task>
  </UsingTask>

  <Target Name="BeforeBuild">
    <PropertyGroup>
      <TargetServer Condition="'$(TargetServer)' == ''">localhost</TargetServer>
    </PropertyGroup>
    <SetEnvironmentVariable Name="TARGET_SERVER" Value="$(TargetServer)"/>
  </Target>

当我尝试在Visual Studio 2013中构建项目时失败但是当我使用MSBuild从命令行构建项目时成功(我使用的是Visual Studio 2013更新2)。

Visual Studio的错误消息是:

Target "BeforeBuild: (TargetId:13)" in project "D:\Dev\Tests.csproj" (target "Build" depends on it):
Initializing task factory "CodeTaskFactory" from assembly "C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Build.Tasks.v12.0.dll".
Using "SetEnvironmentVariable" task from the task factory "Code Task Factory".
Task "SetEnvironmentVariable" (TaskId:14)
D:\Dev\Tests.csproj(130,29): error MSB4064: The "Name" parameter is not supported by the "SetEnvironmentVariable" task. Verify the parameter exists on the task, and it is a settable public instance property.
D:\Dev\Tests.csproj(130,5): error MSB4063: The "SetEnvironmentVariable" task could not be initialized with its input parameters. 
Done executing task "SetEnvironmentVariable" -- FAILED. (TaskId:14)

为什么会出现这种情况?

正如您从输出中看到的那样,我已经将MSBuild的输出转换为诊断级别,但是没有提供任何进一步的线索。我也尝试过使用MSBuildToolsVersion来确保它引用了正确的版本(v12.0)。

据我所知,这些问题应该成为过去MSBuild is now embedded in Visual Studio。我整个上午都努力使用谷歌找到这个问题的答案,但似乎这不是一个非常常见的错误信息,现在我很难过。

2 个答案:

答案 0 :(得分:0)

看一下您所关注的指南,您会注意到您的XML缺少该指南中提供的某些属性:

更新此内容:

  <ParameterGroup>
    <Name />
    <Value />
  </ParameterGroup>

阅读:

  <ParameterGroup>
    <Name ParameterType="System.String" Required="true" />
    <Value ParameterType="System.String" Required="true" />
  </ParameterGroup>

答案 1 :(得分:0)

我有同样的问题我正在编辑包含任务的目标文件,所以我的情况可能会有所不同。但重新启动VS解决了它,我猜我正在编辑的目标正在被缓存,所以没有看到我的更改。