Как перенести командную строку события после сборки в командный файл в MsBuild? - PullRequest
0 голосов
/ 13 марта 2019

В событии сборки моего демонстрационного проекта (проект библиотеки классов) , чтобы скопировать результат сборки .dll в определенную папку, (автоматически создается, если он не существует) , я добавил следующую командную строку в Post-build event раздел командной строки:

xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin\$(ConfigurationName)\Packages\"

Работает отлично.

Затем я попытался заменить эту командную строку вызовом нового пакетного файла с именем CopyPackage.bat , расположенного в $ (SolutionDir). Содержимое командного файла в точности соответствует командной строке:

call $(SolutionDir)CopyPackage.bat

Затем я перестраиваю проект и получаю следующую ошибку:

Код серьезности Описание Состояние подавления строки файла проекта Ошибка Команда "call C: \ TestProjects \ DemoApp \ CopyPackage.bat" завершена с кодом 4. DemoApp

Я что-то пропустил?


Решение после получения от вас советов:

В командной строке события после сборки Я поставил: (см. Параметры)

$ (SolutionDir) CopyPackage.bat "$ (TargetDir) $ (TargetFileName)" "$ (SolutionDir) DemoApp \ bin \ $ (ConfigurationName) \ Packages \"

В командный файл CopyPackage.bat :

set targetfile=%~1
set targetdir=%~2
echo %targetfile%
echo %targetdir%
xcopy /Y %targetfile% %targetdir%

Ответы [ 3 ]

1 голос
/ 13 марта 2019

Не нужно использовать call, вы можете просто вызвать пакетный скрипт напрямую.

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

Вместо этого, если вы преобразуете это в цель msbuild и правильно внедрите сигнализацию ввода / вывода, вы получите много временивозможность использовать функции инкрементной сборки MsBuild.

Например:

<Target Name="CopyOutputs"
    Inputs="@(BuiltAssemblies)"
    Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">

    <Copy
        SourceFiles="@(BuiltAssemblies)"
        DestinationFolder="$(OutputPath)"/>

</Target>

Более подробную информацию о пошаговых сборках и входной / выходной сигнализации можно найти:

1 голос
/ 14 марта 2019

Изменение пути в вашем CopyPackage.bat на абсолютный путь может помочь решить эту проблему.

Свойства, подобные этим: $ (TargetDir), $ (SolutionDir) распознаются msbuild.exeинструмент, так как они являются частью свойств msbuild и определены или импортированы в текущую среду.

При использовании xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin\$(ConfigurationName)\Packages\" в post-build-event инструмент msbuild может их распознать. Так что в первый раз, это успешно.

Впрочем, во второй раз.Движок msbuild может распознавать свойства в post-build-event, поэтому он успешно вызывает .bat.Но, так как .bat не может распознать свойство Msbuild (эти свойства могут быть распознаны только MSbuild.exe, а не .bat или cmd.exe), сборка не удастся найти путь.

1 голос
/ 13 марта 2019

call является внутренней командой cmd.exe, вместо нее следует использовать

cmd.exe /c "$(SolutionDir)CopyPackage.bat"

.

Редактировать:

Содержимое пакетаfile - это в точности командная строка, указанная выше

Переменные VS не будут правильно разрешены внутри файла .bat.Вы должны передать их как параметры в пакетный файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...