Как выполнить сценарии 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"

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

Другие вопросы по тегам