首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MSBuild错误MSB3021:无法复制文件。找不到文件'obj\Release\myWebProject1.dll‘

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

Stack Overflow用户
提问于 2011-03-02 01:49:36
回答 10查看 68.3K关注 0票数 27

当使用TeamCity编译我的MSBuild XML任务脚本时,它失败了,并显示以下信息:

代码语言:javascript
复制
[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:

代码语言:javascript
复制
<?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项目。帮助?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-03-27 01:47:16

好吧,我想通了。这是一个“配置”不匹配。您有一个使用Configuration=MSBuildRelease构建的项目和另外两个使用Configuration=Release构建的项目。然后,MSBuild在错误的位置查找“中间”程序集。

将您的代码更改为:

代码语言:javascript
复制
<?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>
票数 12
EN

Stack Overflow用户

发布于 2013-04-13 03:53:51

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

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-03-02 02:09:29

这只是我的直觉,但我注意到您正在使用Platform=x86构建解决方案,然后使用Platform=AnyCPU调用这两个WebProjects。如果这两个项目是由解决方案生成的,则生成的输出位置可能与后续的部署调用不同。

其他一些注意事项:

我通常避免使用CallTarget,在您的情况下,我更喜欢这种形式:

代码语言:javascript
复制
<Target Name="BuildProjects">
    <MSBuild Projects="@(ProjectToBuild)" />
</Target>
<Target Name="Build"
    DependsOnTargets="BuildProjects;Publish WebProject1;Publish WebProject2"
    />

双斜杠通常表示以下两种情况之一:

代码语言:javascript
复制
$(OutDir)\$(Intervening)\bin

如果$( intervening )为空,则未计算中间属性,或者如果$(OutDir)属性已具有尾部斜杠,则路径的某一部分已以尾部斜杠结束。

我从来不知道目标名称中可以有空格,我必须检查它,以确保它是有效的!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5158313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档