#batch-file #msbuild #visual-studio-2017 #post-build-event
#пакетный файл #msbuild #visual-studio-2017 #событие после сборки
Вопрос:
В событии сборки моего демонстрационного проекта, (проект библиотеки классов), чтобы скопировать результат сборки .dll
в определенную папку, (созданную автоматически, если она не существует), я добавил следующую командную строку в Post-build event
раздел командной строки:
xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoAppbin$(ConfigurationName)Packages"
Это работает отлично.
Затем я попытался заменить эту командную строку вызовом нового пакетного файла с именем CopyPackage.bat, расположенного в $ (SolutionDir). Содержимое пакетного файла в точности соответствует приведенной выше командной строке:
call $(SolutionDir)CopyPackage.bat
Затем я перестраиваю проект и получаю следующую ошибку:
Описание кода серьезности Ошибка состояния подавления строки файла проекта Команда «call C:TestProjectsDemoAppCopyPackage.bat » завершается с кодом 4. Демо-приложение
Я что-то пропустил?
Решение после получения некоторых подсказок от всех вас:
В командной строке события после сборки я ввожу: (смотрите Параметры)
$(SolutionDir)CopyPackage.bat «$(TargetDir) $(TargetFileName)» «$(SolutionDir)DemoAppbin $ (ConfigurationName) Packages «
В пакетном файле CopyPackage.bat :
set targetfile=%~1
set targetdir=%~2
echo %targetfile%
echo %targetdir%
xcopy /Y %targetfile% %targetdir%
Ответ №1:
Нет необходимости использовать call
вы можете просто вызвать пакетный скрипт напрямую.
Я должен предупредить вас, поскольку целевые объекты после сборки не имеют возможности узнать входные и выходные данные задачи, ей всегда придется выполнять сценарий, даже если ничего не изменилось.
Вместо этого, если вы преобразуете это в целевой объект msbuild и правильно реализуете сигнализацию ввода / вывода, вы выиграете много времени, поскольку сможете использовать возможности инкрементной сборки MSBuild.
Например:
<Target Name="CopyOutputs"
Inputs="@(BuiltAssemblies)"
Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">
<Copy
SourceFiles="@(BuiltAssemblies)"
DestinationFolder="$(OutputPath)"/>
</Target>
Дополнительную информацию об инкрементных сборках и сигнализации ввода / вывода можно найти:
Комментарии:
1. 1 к предложению MSBuild, я тоже попробую его позже. Но MS настаивает на использовании ‘call’, чтобы гарантировать выполнение всех последующих команд: learn.microsoft.com/en-us/visualstudio/ide /…
Ответ №2:
call
является ли внутренняя команда cmd.exe
, которую вы должны использовать
cmd.exe /c "$(SolutionDir)CopyPackage.bat"
вместо этого.
Редактировать:
Содержимое пакетного файла в точности соответствует приведенной выше командной строке
Переменные VS не будут правильно разрешены внутри файла .bat. Вы должны передать их в качестве параметров в пакетный файл.
Комментарии:
1. или просто
"$(SolutionDir)CopyPackage.bat"
2. Я думаю, что реальный ответ находится в последней строке вашего ответа. Сценарий по вопросу, вероятно, завершается с ошибкой, потому что он использует
msbuild
переменные вbat
файле3. @Baruch Я считаю, что явный вызов
cmd.exe
устранит любую двусмысленность.4. Передача параметра в пакетный файл — правильный способ для моей демонстрации. Для работы в реальном мире лучше использовать скрипт real build engine для управления всеми заменами и т.д.
5. @MagB Конечно, существует более одного решения для копирования файла после сборки, мое касалось вашего конкретного случая.
Ответ №3:
Изменение пути в вашем CopyPackage.bat на абсолютный путь может помочь решить эту проблему.
Такие свойства, как эти: $(TargetDir), $(SolutionDir) распознаются msbuild.exe инструмент, поскольку они являются частью свойств msbuild и определены или импортированы в текущую среду.
При использовании xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoAppbin$(ConfigurationName)Packages"
в событии после сборки инструмент msbuild может их распознать.Итак, в первый раз это удается.
Однако, во второй раз. Механизм msbuild может распознавать свойства в событии после сборки, поэтому он успешно вызывает .bat. Но поскольку .bat не может распознать свойство Msbuild (эти свойства могут быть распознаны только MSbuild.exe, не .bat или cmd.exe ), сборка завершится неудачно из-за того, что не найден путь.
Комментарии:
1. Замена переменных жестко заданными путями — наихудшее из возможных решений.
2. @montonero Да, но что вы хотите знать, так это «Я что-то пропустил?», и я просто хочу сказать вам, проблема возникает из-за того, что файл .bat не может распознать свойства msbuild. Если вам нужен простой способ сделать это, лучше сохранить исходную команду в post-build-event.
3. Ваше решение является (очень) плохой практикой. Неважно, насколько это просто. Простая передача папки проекта приведет к ее разрыву.