Как выполнить сценарии PowerShell PS1 из "скриптов" package.json?
Как выполнить сценарии PowerShell ps1 из "сценария" package.json?
Я знаю, как настроить базовый скрипт в package.json "scripts". Например, со следующей конфигурацией я могу выполнить "npm run test", который выведет "это только тест" на консоль:
"scripts": {"test": "echo \" это всего лишь тест \"" }
Однако у меня есть более сложный сценарий, в котором я хотел бы выполнить сценарий PowerShell. Что-то вроде этого:
"scripts": {
"buildAngular": "buildAngular.ps1"
}
Могу ли я выполнить скрипт ps1, как это через объект скриптов? Требуются ли какие-либо специальные настройки / конфигурации? Есть ли дополнительные ограничения?
4 ответа
Предполагая, что powershell находится в вашем PATH, вы можете назвать это так:
"scripts": {
"test": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./test.ps1"
}
Протестировано на Windows 7 с Powershell v4.
Ограничения заключаются в том, что вам нужен установленный Powershell и в вашем PATH. Я не тестировал его с Powershell для Linux, поэтому не уверен, что это решение будет переносимым на другую платформу.
Добавьте к команде PowerShell "powershell", например,
"command": "powershell Remove-Item ..\\folder\\file; Copy-Item -Path folder\\* -Destination ..\\other-folder -Recurse",
"buildAngular": "powershell buildAngular.ps1"
Вы можете установить конфигурацию оболочки сценария - либо черезnpm config set script-shell "powershell"
или переменная среды $env:npm_config_script_shell="powershell"
Тогда вы могли бы использовать
"scripts": {
"test": "Write-Host 'this is only a test'"
}
или
"scripts": {
"buildAngular": ".\\buildAngular.ps1"
}
Я не уверен, можно ли указать такие параметры, как -NoProfile.
Лично я предпочитаю называть.bat
сценарий и прохождение.ps1
имя файла для выполнения в качестве аргумента. Очевидно, что это будет работать только в Windows, так что YMMV.
Внутри пакетного скрипта вы можете проверить, существует ли PowerShell Core, прежде чем вернуться к «родному» PowerShell. Вы также можете поставить свой-NoProfile -ExecutionPolicy
код в пакетном сценарии, поэтому он немного чище вpackage.json
файл.
Пакет.json:
"scripts": {
"test": "build-scripts\RunBuildScript.bat test"
}
ЗапуститьBuildScript.bat:
@ECHO OFF
REM Check the argument passed in. You could also check if the file actually exists.
SET "NpmBuildScriptName=%1"
IF ["%NpmBuildScriptName%"] == [""] (
ECHO "Could not find the name of the script."
GOTO :TidyUp
)
REM Perform some checks for PowerShell Core in the file system.
FOR %%s IN ("PowerShell\pwsh.exe" "\PowerShellCore\pwsh.exe") DO (
IF EXIST %%s (
ECHO "PowerShell found at %%s"
SET "PowerShellPath=%%s"
GOTO :ExecuteScript
)
)
REM If you can't find PowerShell, use the default.
IF ["%PowerShellPath%"] == [""] (
ECHO "PowerShell Core was not found. Defaulting to native PowerShell"
SET "PowerShellPath=powershell"
GOTO :ExecuteScript
)
:ExecuteScript
%PowerShellPath% -NoProfile -ExecutionPolicy Unrestricted -Command "%NpmBuildScriptName%.ps1"
GOTO :TidyUp
:TidyUp
REM Wipe after using.
SET "NpmBuildScriptName="
ECHO 0
тест.ps1
Write-Host "this is only a test"
Очевидно, нужно пройти через множество обручей только для вывода текста, но такой подход делает его немного более расширяемым.