当使用TeamCity编译我的MSBuild XML任务脚本时,它失败了,并显示以下信息:
[10:43:03]: myWebProject1\ myWebProject 1 .csproj (3s)
[10:43:07]: [ myWebProject1\ myWebProject1 .csproj] _CopyWebApplicationLegacy
[10:43:07]: [_CopyWebApplicationLegacy] Copy
[10:43:07]: [Copy] C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets(131, 5): error MSB3021: Unable to copy file "obj\Release\myWebProject1.dll" to "C:\MSBUILDRELEASE\myWebProject1\\bin\myWebProject1.dll". Could not find file 'obj\Release\myWebProject1.dll'.
当我在本地运行它时,它可以工作。
当我将本地输出与构建服务器输出进行比较时,构建服务器上缺少文件。例如,我的构建服务器输出目录中缺少global.asax文件(但在本地编译此文件时不会丢失)。为什么会这样呢?
这是我目前的MSBuildScript:
<?xml version="1.0" encoding="utf-8"?>
<Project
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0"
DefaultTargets="Build">
<PropertyGroup>
<OutputDir>C:\MSBUILDRELEASE</OutputDir>
</PropertyGroup>
<ItemGroup>
<ProjectToBuild Include="UtilityApp.sln" >
<Properties>OutputPath=$(OutputDir);Configuration=MSBuildRelease;Platform=x86</Properties>
</ProjectToBuild>
</ItemGroup>
<Target Name="Build">
<MSBuild Projects="@(ProjectToBuild)"/>
<CallTarget Targets="Publish WebProject1" />
<CallTarget Targets="Publish WebProject2" />
</Target>
<Target Name="Publish WebProject1">
<RemoveDir Directories="$(OutputFolder)"
ContinueOnError="true" />
<MSBuild Projects="WebProject1\WebProject1.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputDir)\WebProject1\;
OutDir=$(OutputDir)\WebProject1\;Configuration=Release;Platform=AnyCPU" />
</Target>
<Target Name="Publish WebProject2">
<RemoveDir Directories="$(OutputFolder)"
ContinueOnError="true" />
<MSBuild Projects="WebProject2\WebProject2.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputDir)\WebProject2\;
OutDir=$(OutputDir)\WebProject2\;Configuration=Release;Platform=AnyCPU" />
</Target>
</Project>
我可以在本地运行这个脚本,它似乎工作得很好(没有生成错误)。当我在我的构建服务器上运行它时,它失败了,并显示MSBuild错误MSB3021。
现在,当我将本地构建输出文件与服务器构建输出文件进行比较时,服务器输出没有那么多文件。例如,我的buildserver上的输出中缺少global.ASAX文件。为什么它只能在本地运行,而不能在我的TeamCity构建服务器上运行?有什么不同?我该如何修复它?
我注意到TeamCity构建代理错误消息中有一个有趣的目录路径:"C:\MSBUILDRELEASE\myWebProject1\bin\myWebProject1.dll“
^ bin文件夹前面有两个斜杠。我没有在任何地方指定这一点。怎么回事?我有一种感觉,我没有正确地构建我的Web项目(也许使用不同的任务方法?)。它似乎可以在本地运行,但不能在我的构建服务器上运行。
我是否正确地构建了我的web项目?这些只是用于web服务(ASMX)部署的Web项目。帮助?
发布于 2011-03-27 01:47:16
好吧,我想通了。这是一个“配置”不匹配。您有一个使用Configuration=MSBuildRelease构建的项目和另外两个使用Configuration=Release构建的项目。然后,MSBuild在错误的位置查找“中间”程序集。
将您的代码更改为:
<?xml version="1.0" encoding="utf-8"?>
<Project
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0"
DefaultTargets="Build">
<PropertyGroup>
<OutputDir>C:\MSBUILDRELEASE</OutputDir>
</PropertyGroup>
<ItemGroup>
<ProjectToBuild Include="UtilityApp.sln" >
<Properties>OutputPath=$(OutputDir);Configuration=MSBuildRelease;Platform=x86</Properties>
</ProjectToBuild>
</ItemGroup>
<Target Name="Build">
<MSBuild Projects="@(ProjectToBuild)"/>
<CallTarget Targets="Publish WebProject1" />
<CallTarget Targets="Publish WebProject2" />
</Target>
<Target Name="Publish WebProject1">
<RemoveDir Directories="$(OutputFolder)"
ContinueOnError="true" />
<MSBuild Projects="WebProject1\WebProject1.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputDir)\WebProject1\;
OutDir=$(OutputDir)\WebProject1\;Configuration=MSBuildRelease;Platform=AnyCPU" />
</Target>
<Target Name="Publish WebProject2">
<RemoveDir Directories="$(OutputFolder)"
ContinueOnError="true" />
<MSBuild Projects="WebProject2\WebProject2.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputDir)\WebProject2\;
OutDir=$(OutputDir)\WebProject2\;Configuration=MSBuildRelease;Platform=AnyCPU" />
</Target>
</Project>
发布于 2013-04-13 03:53:51
在这个bug上花了3个小时后,我开始了一个新项目,我从旧项目中一个接一个地导入了每个文件。我已经能够在每个文件之间进行编译,直到我添加了最后一个文件。
我认为问题与最后一个文件有关,但通过删除其他文件,我意识到只有当我的项目中包含特定数量的文件时,才会发生此问题。
我不知道为什么它会工作,但我通过在项目中添加/删除带有随机名称的空类解决了这个问题。
在几次添加/编译/删除/编译之后,VS开始正常工作。
发布于 2011-03-02 02:09:29
这只是我的直觉,但我注意到您正在使用Platform=x86构建解决方案,然后使用Platform=AnyCPU调用这两个WebProjects。如果这两个项目是由解决方案生成的,则生成的输出位置可能与后续的部署调用不同。
其他一些注意事项:
我通常避免使用CallTarget,在您的情况下,我更喜欢这种形式:
<Target Name="BuildProjects">
<MSBuild Projects="@(ProjectToBuild)" />
</Target>
<Target Name="Build"
DependsOnTargets="BuildProjects;Publish WebProject1;Publish WebProject2"
/>
双斜杠通常表示以下两种情况之一:
$(OutDir)\$(Intervening)\bin
如果$( intervening )为空,则未计算中间属性,或者如果$(OutDir)属性已具有尾部斜杠,则路径的某一部分已以尾部斜杠结束。
我从来不知道目标名称中可以有空格,我必须检查它,以确保它是有效的!
https://stackoverflow.com/questions/5158313
复制相似问题