在TeamCity构建中找不到“TransformXml”任务(错误MSB4036)

时间:2013-05-20 09:43:55

标签: msbuild teamcity sitecore sitecore6 tds

您好我使用TeamCity构建服务器。 我的项目是Sitecore Web Application。我正在使用TDS(HedgehogDevelopment)。我在TeamCity中使用MS build设置了构建设置,当在构建配置管理器中禁用TDS项目时,它看起来像是在工作。 但后来它让我感到网络错误

  

C:\ Program Files   (86)\的MSBuild \ HedgehogDevelopment \ SitecoreProject \ 9.0 \ HedgehogDevelopment.SitecoreProject.targets(310,   5):错误MSB4036:找不到“TransformXml”任务。检查   以下内容:1。)项目文件中的任务名称与   任务类的名称。 2.)任务类是“公共的”和   实现Microsoft.Build.Framework.ITask接口。 3.)任务   在项目文件中或在。中正确声明   * .tasks文件位于“C:\ Windows \ Microsoft.NET \ Framework64 \ v3.5”目录中。项目   NetKey.TDSMaster \ MyProject.TDSMaster.scproj失败。项目   网站\ MyProject.sln失败

错误描述中的帮助不适合我。 我在构建机器上没有VS 2012。我已经安装了Microsoft Visual Studio 2012 Shell 支持我的web项目。 怎么解决? 谢谢。

8 个答案:

答案 0 :(得分:21)

TransformXML是ASP.NET Web发布工具的一部分。因此,它们通常在构建服务器上安装Visual Studio,并且不仅需要Shell版本的Visual Studio。安装Visual Studio Express Web Edition也可能起到作用。

您可以尝试安装Web-Deploy package以查看它是否足够,但通常我只是在构建代理上安装Visual Studio的完整版本。根据MSDN订阅许可,这是合法的。

经过一些实验,我可以告诉您至少需要在构建服务器上安装Visual Studio Web Developer Tools才能以官方方式安装这些任务。我怀疑安装Visual Studio Express网络版就足够了。

enter image description here

答案 1 :(得分:18)

试试这个:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />

答案 2 :(得分:13)

简答 - 明确导入

我必须做的事情:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.targets" Condition="!Exists('$(VSToolsPath)\Web\Microsoft.Web.Publishing.targets')" />

长答案

当您执行文件 - &gt;在VS2013中的新Web项目中,您可以在* .csproj文件中获得以下内容:

<PropertyGroup>
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />

在构建计算机和多台开发计算机上,$(VisualStudioVersion)始终为11.0评估为12.0。即使在使用VS2013的机器上,也就是Microsoft.WebApplication.targets

潜入其中我发现在上面的Microsoft.Web.Publishing.targets中,只有在第377行存在的情况下,它才会导入我们真正想要的文件<!--Import publishing target--> <Import Project="..\Web\Microsoft.Web.Publishing.targets" Condition="Exists('..\Web\Microsoft.Web.Publishing.targets')" />

Microsoft.Web.Publishing.targets

所以对我来说,这是TransformXml隐式导入。

问题是,如果此文件不存在,则在尝试使用Microsoft.Web.Publishing.targets任务时遇到错误之前,它不会执行任何操作并且您不知道它。

安装VS2013未在11.0目录中安装12.0。它确实将它安装在Microsoft.Web.Publishing.targets目录中。我猜我是否安装了VS2012,它这样做。

无论如何,我能够通过显式12.0目录导入Microsoft.WebApplication.targets来解决它,如果它不存在且不是隐式导入<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.targets" Condition="!Exists('$(VSToolsPath)\Web\Microsoft.Web.Publishing.targets')" /> ,如下所示:

{{1}}

答案 3 :(得分:1)

默认情况下,在Visual Studio 2017中,未安装大多数(或所有?)组件,但您可以按https://docs.microsoft.com/en-us/visualstudio/install/modify-visual-studio中所述添加所需内容(即Asp.Net和Web开发)。

在我的机器上,安装程序位于&#34; C:\ Program Files(x86)\ Microsoft Visual Studio \ Installer \ vs_installer.exe&#34;

答案 4 :(得分:1)

提供的解决方案似乎适用于将 VS 用作 IDE,但如果您通过 CLI 或在基于 Unix 的系统上使用 DotnetCore,则这不起作用。

我发现以下似乎有效

  <PropertyGroup>
    <XmlTransformDllPath Condition="'$(XmlTransformDllPath)' == '' AND '$(MSBuildRuntimeType)' == 'core'">$(MSBuildSDKsPath)/Microsoft.NET.Sdk.Publish/tools/net5.0/Microsoft.NET.Sdk.Publish.Tasks.dll</XmlTransformDllPath>
    <XmlTransformDllPath Condition="'$(XmlTransformDllPath)' == '' AND '$(MSBuildRuntimeType)' != 'core'">$(MSBuildSDKsPath)/Microsoft.NET.Sdk.Publish/tools/net472/Microsoft.NET.Sdk.Publish.Tasks.dll</XmlTransformDllPath>
    <XmlTransformDllPath Condition="!Exists($(XmlTransformDllPath))">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll</XmlTransformDllPath>
  </PropertyGroup>
  <UsingTask TaskName="TransformXml" AssemblyFile="$(XmlTransformDllPath)" />

这个解决方案考虑了netcore,完整的.net

出于某种原因,使用 CLI 与 VS2019 时,Windows 上的 MSBuildSDKsPathMSBuildExtensionsPath32 不同

命令行界面: MSBuildSDKsPath = C:\Program Files\dotnet\sdk\5.0.103\Sdks MSBuildExtensionsPath32 = C:\Program Files\dotnet\sdk\5.0.103

Vs2019 MSBuildSDKsPath = C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Sdks MSBuildExtensionsPath32 = C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild

在我的 Mac 上返回 /usr/local/share/dotnet/sdk/5.0.201

我看到的唯一问题是名称的 tools/net5.0 部分会在发布时发生变化

答案 5 :(得分:0)

在VS2015中将TypeScript工具从2.4.10降级到2.3.3后,我遇到了同样的问题。

<强>解决方案

我从Microsoft.TypeScript.targets文件

中删除它
    <FormatLocalizedString Condition="'$(TypeScriptVersionCheckResult)' == 'NoneSpecified'"
  Culture="$(PreferredUILang)" 
  Name="TypeScriptNoVersionWarning" 
  Arguments="$(LastKnownTypeScriptVersion)">
  <Output TaskParameter="String" PropertyName="TypeScriptNoVersionWarning" />
</FormatLocalizedString>

<FormatLocalizedString Condition="'$(TypeScriptVersionCheckResult)' == 'Downgrade' OR '$(TypeScriptVersionCheckResult)' == 'Upgrade'"
  Culture="$(PreferredUILang)" 
  Name="TypeScriptVersionMismatchWarning" 
  Arguments="$(TypeScriptToolsVersion);$(LastKnownTypeScriptVersion)">
  <Output TaskParameter="String" PropertyName="TypeScriptVersionMismatchWarning" />
</FormatLocalizedString>

答案 6 :(得分:0)

您有很多Visual Studio版本,请尝试

    

VS2015

<UsingTask TaskName="TransformXml"
    Condition=" Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll') "
    AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>

VS 2017

<UsingTask TaskName="TransformXml"
    Condition=" Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.Tasks.dll') "
    AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>

VS 2019

<UsingTask TaskName="TransformXml"
    Condition=" Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v16.0\Web\Microsoft.Web.Publishing.Tasks.dll') "
    AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v16.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>

<Target Name="TransformConfig">
    <MakeDir Directories="$(TargetDir)" Condition="  Exists('$(TargetPath)') == False " />
    <TransformXml Source="app.config"
        Transform="app.$(Configuration).config"
        Destination="$(TargetPath).config" />
</Target>

答案 7 :(得分:0)

尝试在命令行中使用msbuild构建项目时遇到了这个问题。该命令非常大,我没有注意到参数/p:VisualStudioVersion="14.0"是错误的,导致到Microsoft.Web.Publishing.targets的路径错误。由于我使用的是Visual Studio 2019,因此应该/p:VisualStudioVersion="16.0"或将其删除。

对于有相同问题的任何人,请仔细检查您的msbuild参数,并检查是否有任何.csproj属性取决于您的Visual Studio版本。

我知道 C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VisualStudio\v16.0\Web\Microsoft.Web.Publishing.targets 应该导入,但是我的.csproj有

<Import Project="$(VSToolsPath)\Web\Microsoft.Web.Publishing.targets" Condition="!Exists('$(VSToolsPath)\Web\Microsoft.Web.Publishing.targets')" />

,仍然找不到TransformXml。我尝试使用

记录VsToolsPath
<Project InitialTargets="CopyInitialConfig">
    ...
    <Target Name="MyTarget">
        <Message Importance="High" Text="VS Tools is at $(VSToolsPath)" />
    </Target>
    ...

哪个版本已登录

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.targets