Как исправить ошибку MSB3073 в моем событии после сборки?
Я работаю над проектом, который требует, чтобы DLL генерировались путем создания моего решения для копирования из папки bin в другую папку, оба из которых находятся на моей машине, на моем диске C. Я написал пакетный файл, который использует xcopy для выполнения этого, который вы можете увидеть здесь:
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.dll" "C:\inetpub\wwwroot\AppServer\bin\"
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.pdb" "C:\inetpub\wwwroot\AppServer\bin\"
Теперь я пробовал многочисленные итерации этого файла, который находится по адресу:
C:\Users\scogan\Desktop\CopyFiles.bat
поэтому моя командная строка события post-build выглядит следующим образом:
call C:\Users\scogan\Desktop\CopyFiles.bat
Я запускаю этот пакетный файл самостоятельно с двумя текстовыми файлами в папках на моем рабочем столе, и он отлично работает. Я также запускаю его так же, как и файлы, которые мне нужно копировать самостоятельно, и это тоже отлично работает. Однако, когда я пытаюсь запустить это как событие после сборки, я получаю этот вывод:
1> Organizr -> C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Client\bin\Debug\Organizr.exe
1> File not found - Organizr.Services.dll
1> 0 File(s) copied
1> 0 File(s) copied
1> File not found - Organizr.Services.pdb
1>c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "call C:\Users\scogan\Desktop\CopyFiles.bat" exited with code 4.
Я провел некоторое исследование и обнаружил, что код ошибки 4 означает, что произошла ошибка инициализации. Недостаточно памяти или места на диске, или вы ввели недопустимое имя диска или недопустимый синтаксис в командной строке. "
Я также посмотрел, что такое MSB3073, и на самом деле не нашел много того, что может мне помочь. Итак, мой вопрос в том, что я делаю неправильно? Абсолютные пути испортили его? Любая помощь здесь ценится.
Ответы
Ответ 1
Играя с различными свойствами проекта, я обнаружил, что проблема сборки проекта была проблемой. Проект, который сгенерировал файлы, которые я хотел скопировать, был построен второй, но проект, который запускал командный файл в качестве события после сборки, был создан first, поэтому я просто приложил событие сборки ко второму проекту, и он работает отлично. Спасибо за вашу помощь, все, тем не менее.
Ответ 2
Предпочитаете задачу "Копировать" MsBuild в целевой среде AfterBuild в событии после сборки.
Добавьте эту цель в свой файл проекта и удалите PostBuildEvent.
<Target Name="AfterBuild">
<Copy SourceFiles="C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.*"
DestinationFolder="C:\inetpub\wwwroot\AppServer\bin\"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
</Target>
Ответ 3
Для чего это стоит, проблема в моем случае была вызвана использованием '/' в качестве разделителя каталогов в команде copy
. Необходимо использовать обратную косую черту.
Ответ 4
В моем случае, DLL, которую я создавал, создавая проект, все еще используется в фоновом режиме. Я убил приложение, а затем xcopy работал нормально, как ожидалось.
Ответ 5
Это слишком поздно, но опубликую свой опыт для людей, которые смотрят на него позже: -
В MS VS 2010 у меня была такая же проблема. Это было решено путем помещения кавычек в аргументы команды копирования после сборки, которые содержали пробелы!
В Project Properties --> Configuration Properties --> Build Events --> Post-Build Event --> Command Line
измените:
copy $(ProjectDir)a\b\c $(OutputPath)
в
copy "$(ProjectDir)a\b\c" "$(OutputPath)"
Ответ 6
Указанная ошибка связана с событием после сборки. Почему-то VS средство не может скопировать файлы в папку назначения. Причин может быть много. Чтобы выяснить точную причину ошибки, перейдите в Сервис> Опция> Проект и решение> Построить и запустить и измените "Детализация сборки проекта MsBuild" на "Диагностика". Это даст вам достаточно информации, чтобы обнаружить актуальную проблему.
Ответ 7
Если проблема по-прежнему сохраняется даже после установки после сборки в правильном проекте, попробуйте использовать "copy" вместо xcopy. Это сработало для меня.
Ответ 8
Событие после сборки (в разделе "События сборки" в диалоговом окне свойств) импортированного проекта имело переменную среды, которая не была определена.
Перейдите к Control Panel\All Control Panel Items\System\Advanced system settings
, чтобы добавить соответствующую переменную среды , и сделайте не более, чем перезапуск VS2017, чтобы устранить ошибку.
Кроме того, следуя @Seans и другим ответам, касающимся нескольких рас/конфликтов проекта, создайте временную папку в выходной папке следующим образом:
![like so]()
и выберите проект, выдающий предпочтительный результат:
![enter image description here]()
и сборка (без перестройки/очистки) - это быстрое решение.
Ответ 9
Я решил это, выполнив следующее:
В Visual Studio я пошел в Project -> Project Dependencies
Я выбрал решение XXX.Test
и сказал, что от решения XXX
также зависит, чтобы события post-build
в решении XXX.Test
не генерировали эту ошибку (выйдите с code 4
).
Ответ 10
Следующее, что вы должны сделать перед запуском команды копирования, если у вас возникли проблемы с командой копирования
- откройте решение от имени администратора и создайте решение.
- если у вас возникла проблема, например, "0 File (s) скопированы"), проверьте исходный и целевой путь. возможно, вы используете неправильный путь. было бы лучше, если бы вы запускали ту же команду в "командной строке", чтобы проверить, работает ли она нормально или нет.
Ответ 11
У меня была такая же проблема для моего тестового проекта. Я узнал, почему мое событие сборки сообщений не работает и что, поскольку я копировал файлы перед запуском команды $(ProjectName).exe, и некоторые из этих файлов были необходимы для самого проекта тестирования. Следовательно, просто перемещая $(ProjectName).exe, поскольку первая команда исправляет проблему.
Ответ 12
Я обнаружил, что проблема возникает, когда несколько проектов строятся параллельно, и один или несколько проектов пытаются скопировать одни и те же файлы, создавая условия гонки, которые приводят к случайным ошибкам. Так как это решить?
Там много вариантов, как и выше, просто изменение вещей может решить проблему для некоторых людей. Более надежные решения были бы...
Ограничьте копируемые файлы, т.е. вместо xcopy $(TargetDir)*.*"
... вместо этого сделайте xcopy "$(TargetDir)$(TargetName).*"
...
Перехватите ошибку и повторите попытку, т.е.
:loop
xcopy /Y /R /S /J /Q "$(TargetDir)$(TargetName).*" "somewhere"
if ErrorLevel 1 goto loop
Используйте robocopy вместо xcopy
Вы, вероятно, не захотите этого делать, так как это увеличит время сборки, но вы можете уменьшить максимальное количество параллельных сборок проекта до 1...
![enter image description here]()