Ошибка MSBuild MSB3021: невозможно скопировать файл. Не удалось найти файл 'obj \ Release \ myWebProject1.dll' - PullRequest
21 голосов
/ 01 марта 2011

При использовании 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.

Теперь, когда я сравниваю свои локальные выходные файлы сборки с выходными файлами моей сборки сервера, на выходе сервера не так много файлов.Например, файл global.ASAX отсутствует в выводе на моем сервере сборки.Почему он будет работать локально для меня, но не на моем сервере сборки TeamCity?В чем разница и как я могу это исправить?

Я заметил, что сообщение об ошибке агента сборки TeamCity содержит забавный путь к каталогу: "C: \ MSBUILDRELEASE \ myWebProject1 \ bin \ myWebProject1.dll"

^ Перед папкой находится две косые черты.Я не указываю, что нигде.Что дает?У меня такое чувство, что я неправильно строю свои веб-проекты (может быть, используется другой подход к задаче?)Кажется, он работает локально, но не на моем сервере сборки.

Правильно ли я собираю свои веб-проекты?Это просто веб-проекты для развертывания веб-сервисов (ASMX).Помощь

Ответы [ 7 ]

11 голосов
/ 26 марта 2011

Хорошо, я понял это. Это несоответствие «Конфигурации». У вас есть одна сборка проекта с Configuration = MSBuildRelease и две другие сборки с конфигурацией = 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>
3 голосов
/ 12 апреля 2013

Потратив 3 часа на эту ошибку, я запустил новый проект и импортировал каждый файл из старого проекта один за другим. Я был в состоянии скомпилировать между каждым файлом, пока я не добавил последний файл.

Я думал, что проблема связана с этим последним файлом, но, удалив другие файлы, я понял, что эта проблема возникает только тогда, когда в моем проекте было определенное количество файлов.

Я не могу сказать, почему это работает, но я решил эту проблему, добавив / удалив пустые классы со случайными именами в мой проект.

После пары Add / Compile / Remove / Compile снова VS начал работать правильно.

2 голосов
/ 01 марта 2011

Просто догадка, но я заметил, что вы строите решение с Platform = x86, а затем вызываете два WebProjects с Platform = AnyCPU.Если эти два проекта строятся решением, расположение вывода может быть другим для сборки и последующего вызова для развертывания.

Некоторые другие примечания:

Я обычно избегаю CallTarget, ипредпочел бы эту форму в вашем случае:

<Target Name="BuildProjects">
    <MSBuild Projects="@(ProjectToBuild)" />
</Target>
<Target Name="Build"
    DependsOnTargets="BuildProjects;Publish WebProject1;Publish WebProject2"
    />

Удвоенные косые черты обычно указывают на одну из двух вещей:

$(OutDir)\$(Intervening)\bin

Любое Промежуточное свойство не оценивалось, если $ (Intervening) равнопусто, или одна из частей пути уже заканчивается косой чертой, если у свойства $ (OutDir) уже есть косая черта.

Я никогда не знал, что в целевом имени могут быть пробелы, у меня былочтобы проверить это, просто чтобы убедиться, и это сработало!

0 голосов
/ 27 мая 2019

Я столкнулся с той же проблемой при подключении к MDF через сущность. Решил это, просто очистив раствор и восстановив его. Надеюсь, это поможет ..

0 голосов
/ 13 ноября 2017

Шаг 1. Перезапустите Visual Studio.

Шаг 2: сборка >> перенастройка приложения.

Я правильно понял.

0 голосов
/ 22 января 2016

Пока у меня была точно такая же ошибка;в моем случае у меня был проект развертывания Wix (v3.9) (MSI - для настольного приложения), который запустил Heat.exe для извлечения файла из выходной папки.Оказалось, что VS и Heat не играют хорошо, если у вас нет атрибута

RunAsSeparateProcess = "true"

, установленного в задаче предварительной сборки Heat Directory.Нашел это после многих часов разочарования.см. Wix HeatFile Task Locks Dll для подробностей.HTH кто-то.

0 голосов
/ 11 июля 2015

У меня была эта проблема при попытке развертывания в appharbor, для меня, исключая файл, затем снова включив в него исправленную проблему

...