MSBuild «Невозможно скопировать файл» в среде CI - PullRequest
2 голосов
/ 15 июля 2009

Я использую Hudson в качестве сервера непрерывной интеграции. Работа в конечном итоге начинает MSBuild. Все время от времени моя сборка завершается с ошибкой без компиляции кода из MSBuild:

C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(2703,9): error MSB3021: Unable to copy file "..\Lib\Microsoft\Microsoft.Practices.Unity.Configuration.dll" to "bin\Debug\Microsoft.Practices.Unity.Configuration.dll". Access to the path 'bin\Debug\Microsoft.Practices.Unity.Configuration.dll' is denied.

Когда я проверяю 'bin \ Debug \ Microsoft.Practices.Unity.Configuration.dll', я обнаруживаю, что это 0-байтовый файл.

Я в недоумении, почему этот файл проблематичен. Есть идеи?

Ответы [ 4 ]

6 голосов
/ 23 марта 2013

Задача MS Build Copy имеет недокументированную функцию, по крайней мере, Google хранит молчание. Если задана общесистемная переменная среды MSBUILDALWAYSRETRY = 1 Эта задача будет повторять попытку копирования файла, даже если во время операции копирования возникнет исключение «Отказано в доступе»

Пример вывода

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3513): Got System.UnauthorizedAccessException: Access to the path 'C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)
   at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)
   at Microsoft.Build.Tasks.Copy.CopyFileWithLogging(FileState sourceFileState, FileState destinationFileState)
   at Microsoft.Build.Tasks.Copy.DoCopyWithRetries(FileState sourceFileState, FileState destinationFileState, CopyFileWithState copyFile) copying C:\Builds\8\28\Sources\Main\Solutions\packages\System.Spatial.5.2.0\lib
et40\fr\System.Spatial.resources.dll to C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll and HR is -2147024891
 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3513): Retrying on ERROR_ACCESS_DENIED because MSBUILDALWAYSRETRY = 1
 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3513): Could not copy "C:\Builds\8\28\Sources\Main\Solutions\packages\System.Spatial.5.2.0\lib
et40\fr\System.Spatial.resources.dll" to "C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll". Beginning retry 1 in 1000ms. Access to the path 'C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll' is denied.
1 голос
/ 16 июля 2009

Похоже, процесс держит bin \ Debug \ Microsoft.Practices.Unity.Configuration.dll открытым. Вы можете проверить это раньше, переименовав «bin» во что-то еще, например «bin-old», а затем удалив «bin-old». Если какой-либо процесс удерживает файлы в «bin» открытым, переименование завершится неудачей.

0 голосов
/ 16 июля 2009

Используйте файл Handle.exe от SysInternals (Microsoft), чтобы узнать, какие файлы открыты для каких процессов.

Запустите это в командной строке cmd, когда вы получите ошибку; Handle.exe> ​​OpenFile.txt Notepad.exe OpenFile.txt

Затем найдите в файле OpenFile.txt заблокированный файл, и вы увидите процесс.

Ryan

...