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

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

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

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


person D3vtr0n    schedule 01.03.2011    source источник
comment
У меня похожие проблемы. Кажется, это связано с проблемой того, где также скомпилированы библиотеки DLL. Если Configuration = Release, файлы выводятся в obj \ Release \, а если Configuration = Debug, они выводятся в obj \ Debug \. Но если у вас Configuration = SomethingElse, мои файлы выводятся в obj \ SomethingElse, но MSBuild по-прежнему смотрит на obj \ Release. Моя конфигурация SomethingElse была скопирована из конфигурации Release ... Почему она не смотрит в нужную папку? Думаю, это проблема с целью _CopyWebApplicationLegacy для VS2010.   -  person Carl    schedule 26.03.2011
comment
Я посоветовал вам удалить все файлы и папки в папке obj на машине разработки и попробовать снова запустить скрипт msbuild. Я полагаю, если ваша проблема похожа на мою, вы получите ту же ошибку на своем локальном компьютере, что и на своем сервере сборки.   -  person Carl    schedule 26.03.2011
comment
Другая ситуация, с которой я столкнулся, заключается в том, что рассматриваемые файлы помечены как ReadOnly. В моем случае другая DLL возникла в системе управления версиями, таким образом, ReadOnly. Когда я удалил ReadOnly из DLL, проблема исчезла. MSBuild не будет копировать файлы поверх себя, если они доступны только для чтения.   -  person John Dyer    schedule 07.11.2013


Ответы (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>
person Carl    schedule 26.03.2011
comment
На самом деле я не смог это проверить. В итоге я использовал CruiseControl.NET для создания своего .NET-решения, и это сработало намного проще. Поддержка TeamCity была очень медленной и продолжала винить Microsoft. Поддержка Microsoft возложила бы на них вину. Вместо этого CruiseControl.NET был запущен и создал мое приложение за несколько часов. В конечном итоге я могу перейти на TeamCity, поскольку я использую TeamCity для создания своих проектов FLEX и FLASH. Кто знает, но я отмечаю ваш ответ как правильное решение. - person D3vtr0n; 09.04.2011
comment
Время от времени я наблюдаю аналогичную ошибку MSBuild, хотя для меня это всегда связано с копированием из <full path>\bin\Debug\MyProject.dll в bin\Debug\MyProject.dll, которое в некоторые дни внезапно начинает давать сбой для нескольких сборок. Это как-то связано с конфигурациями, поскольку переключение затронутых проектов на Release вместо Debug (которое в противном случае установлено для всех проектов в решении) предотвратит возникновение проблемы. происходит. Пока не уверен, как удовлетворительно решить проблему, но спасибо за подсказку о конфигурациях. - person O. R. Mapper; 21.10.2013
comment
Спасибо. Решил мою проблему, изменив вывод моего релиза на то, куда указывал вывод отладки. Если бы эта ошибка возникла после того, как я попытался построить с использованием выпуска, отладка всегда работала. - person Shane van Wyk; 15.01.2014
comment
этот ответ, по крайней мере, заставил меня взглянуть на конфигурации, используемые TC. Спасибо. - person Hulvej; 26.11.2014

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

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

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

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

person The_Black_Smurf    schedule 12.04.2013

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

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

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

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

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

$(OutDir)\$(Intervening)\bin

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

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

person Brian Kretzler    schedule 01.03.2011
comment
хорошо, проблема с двойной обратной косой чертой, которую я понял, должна быть больше такой: Properties = WebProjectOutputDir = $ (OutputDir) \ WebProject1; без косой черты в конце. Свойство OutDir требует завершающей косой черты. Поймите, подумайте? - person D3vtr0n; 02.03.2011
comment
Меня просто осенило, что в сообщении об ошибке не указан полный путь. Он пытается использовать obj \ Release \ myWebProject1.dll. Как мне изменить это, чтобы использовать полный путь? Я указываю только два пути (WebProjectOutputDir и OutDir). Я не понимаю, где это было бы неправильно ?? - person D3vtr0n; 02.03.2011
comment
Обычно $ (OutDir) имеет значение bin \ Debug, но вы, похоже, передаете папку проекта в своих вызовах задаче MSBuild в двух ваших целевых объектах публикации. Возможно ли, что вы смешиваете стандартное свойство $ (OutDir) со своим собственным пользовательским свойством $ (OutputDir)? - person Brian Kretzler; 02.03.2011
comment
Сегодня я установил Visual Studio 2010 (профессиональный) на свой сервер сборки. Я запустил сценарий сборки через командную строку VS. Я получаю ту же ошибку, не могу скопировать файл, бла-бла. Это странно, потому что моя машина для разработки просто в порядке, когда строит это. Ошибок нет. Это происходит только на моем сервере сборки. Любые идеи? А как насчет файлов .target для материала _CopyWebApplication? - person D3vtr0n; 02.03.2011
comment
что сейчас странно, так это то, что я заставляю его компилировать на моем сервере сборки из командной строки. но когда я использую TeamCity для его запуска, возникает эта ошибка. Это должны быть точно такие же скрипт и компилятор. Я не знаю, зачем он это делает. Microsoft продолжает отправлять меня в службу поддержки TeamCity. Посмотрим. - person D3vtr0n; 03.03.2011
comment
прикрепите диагностический журнал / fl /flp:v=diag;logfile=log.txt к командной строке для обеих сборок, сборки командной строки, которая работает, и сборки TeamCity, которая завершилась ошибкой, затем сравните два файла журнала. Обратите внимание на раздел для каждого проекта, в котором перечислены значения свойств и элементов. В идеале они должны быть одинаковыми, поэтому любые существенные различия могут дать ключ к разгадке. - person Brian Kretzler; 03.03.2011

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

person Jay    schedule 11.07.2015

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

RunAsSeparateProcess = "истина"

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

person Shreyas Murali    schedule 22.01.2016

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

Шаг 2: Сборка >> Перенастроить приложение.

Я так понял.

person Geomatik Mühendisi    schedule 13.11.2017

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

person IUN KHAN    schedule 27.05.2019

У меня была такая же ошибка. Посмотрите Target framework. По ошибке я изменил netcore с 2.1 на 2.0

person João Baganha    schedule 05.12.2019

Мое решение для этого - открыть TaskManager / win или Monitor / mac и убить всю визуальную студию и связанные процессы.

person martcs    schedule 10.01.2020

Мой проект снова строится после удаления папок «obj» и «bin».

person Viree    schedule 03.03.2020

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

person vlad    schedule 15.06.2021