MSBuild错误MSB3021:无法复制文件。找不到文件'obj \ Release \ myWebProject1.dll'

时间:2011-03-01 17:49:36

标签: .net .net-4.0 msbuild teamcity msbuild-task

使用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 Service(ASMX)部署的Web项目。帮助

11 个答案:

答案 0 :(得分:11)

好吧,我明白了。这是“配置”不匹配。您有一个带有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>

答案 1 :(得分:3)

在这个bug上花了3个小时后,我开始了一个新项目,我逐个从旧项目中导入了每个文件。我已经能够在每个文件之间进行编译,直到我添加了最后一个文件。

我认为这个问题与最后一个文件有关,但我意识到只有当我的项目中包含特定数量的文件时才删除其他文件才会发生此问题。

我不知道为什么会有效,但我通过在项目中添加/删除带有随机名称的空类来解决这个问题。

再次添加/编译/删除/编译几次后,VS开始正常工作。

答案 2 :(得分:2)

只是预感,但我注意到您正在使用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)属性已经有一个尾部斜杠,则不会评估干预属性。

我从来不知道你的目标名称中可能有空格,我必须检查它才能确定它是否有效!

答案 3 :(得分:0)

尝试部署到appharbor时遇到此问题,对我来说,排除文件然后重新包含它修复了问题

答案 4 :(得分:0)

虽然我有完全相同的错误;在我的情况下,我有一个Wix(v3.9)部署项目(MSI - 用于桌面应用程序),它运行Heat.exe以从输出文件夹中获取文件。原来,如果你没有

,VS和热火队就不会发挥出色
  

RunAsSeparateProcess =&#34;真&#34;

在Heat Directory预构建任务上设置

属性。经过数小时的挫折后发现了这一点。 有关详细信息,请参阅Wix HeatFile Task Locks Dll。 HTH某人。

答案 5 :(得分:0)

第1步:重新启动Visual Studio。

第2步:构建&gt;&gt;重新配置应用程序。

我是这样做的。

答案 6 :(得分:0)

通过实体框架连接到MDF时,我遇到了同样的问题。只需清洁溶液并重新构建即可解决该问题。希望对您有帮助。

答案 7 :(得分:0)

我有同样的错误。查看目标框架。出于错误,我将netcore从2.1更改为2.0

答案 8 :(得分:0)

为此,我的解决方案是打开TaskManager / win或Monitor / mac 并杀死所有Visual Studio和相关流程。

答案 9 :(得分:0)

删除'obj'和'bin'文件夹后,我的项目再次构建。

答案 10 :(得分:0)

为那些使用 Github 的人提供快速解决方案 - 只需将上次提交的项目复制到不同的空文件夹即可。 我现在就这样做了,而且效果很好。