Подтвердить что ты не робот

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

При использовании TeamCity для компиляции моей задачи MSBuild XML script он не работает с этим:

[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>

Я могу запустить этот script локально и, похоже, работает нормально (никаких ошибок не генерируется). Когда я запускаю его на моем сервере сборки, он терпит неудачу с MSBuild ошибкой MSB3021.

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

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

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

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

4b9b3361

Ответ 1

Хорошо, я понял это. Это несоответствие "Конфигурация". У вас есть одно проектное здание с конфигурацией = 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>

Ответ 2

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

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

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

После повторного добавления/компиляции/удаления/компиляции VS начал работать правильно.

Ответ 3

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

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

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

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

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

$(OutDir)\$(Intervening)\bin

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

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

Ответ 4

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

Ответ 5

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

RunAsSeparateProcess = "истина"

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

Ответ 6

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

Шаг 2: Сборка → Переконфигурируйте приложение.

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

Ответ 7

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