Как я могу заставить проекты npm работать с командами оболочки Bash в Windows? - PullRequest
2 голосов
/ 22 марта 2019

У меня есть несколько сценариев NPM для проекта, который я недавно взял на себя, который выглядит следующим образом:

{
    "package": "yarn package-common && mv './dist/APP® TV.wgt' ''./package/$(yarn -s filename)''",
    "package-common": "tizen package -t wgt -s APP -- ./dist && rimraf package && mkdir package",
    "filename": "cross-env-shell echo APP_${npm_package_version}.wgt",
}

Этот проект был написан кем-то на MAC. Как я могу перевести следующую часть в работающую команду Powershell / cmd? Я ничего не нашел по этому поводу. Он запускает команду, и возвращаемое значение добавляется к строке, из которой он вызван.

''./package/$(yarn -s filename)''

Или даже лучше, кроме этого пакета есть способ сделать его кроссплатформенным?

В настоящее время сообщение, которое получает вывод в powershell при запуске пакета пряжи:

'' was unexpected at this time.

1 Ответ

3 голосов
/ 22 марта 2019

Ваш основной выбор для кроссплатформенности без специфичных для платформы сценариев :

  • Использовать Bash также в Windows :

    • Запустите ваши сценарии npm из Bash через WSL и используйте существующие команды Bash , обычно содержащиеся в package.json файлах, например в случай.

    • В качестве альтернативы, с установленным Git для Windows , настройте npm для использования bash.exe в качестве оболочки для вызова команд - см. этот ответ [ npm v5.1 +].

  • Установка PowerShell Core на всех ваших платформах (включая Windows) и определяют команды как команды PowerShell (см. Ниже) [npm v5 0,1 +].

Обратите внимание на требование к версии npm (версия 5.1 или выше), где это было отмечено, из-за того, что опция конфигурации для использования определенной оболочки (script-shell) не была доступна в более ранних версиях. Запустите npm -v, чтобы получить установленную версию, и
npm install -g npm, если возможно, обновите.


Использование npm с PowerShell Core на всех платформах [npm v5.1 +]:

  • Установка PowerShell Core.

  • Затем настройте npm для использования PowerShell Core в качестве оболочки (требуется npm версии 5.1 или выше):

    • Для всех ваших проектов или по всему миру :

      npm config set script-shell pwsh [--global]
      
    • Только для данного проекта (из корневого каталога этого проекта):

      npm config set script-shell pwsh --userconfig ./.npmrc
      
  • Наконец, в ключах package.json scripts ваших проектов определите команды как команды PowerShell.

В данном случае:

Например, перевести эту команду Bash:

yarn package-common && mv './dist/APP® TV.wgt' "./package/$(yarn -s filename)"

Примечание: я заменил '' на ", потому что последние имеют больше смысла; как первоначально написано, '' фактически отбрасывается Bash, и результат подстановки команды $(yarn -s filename) может нарушить команду, если она содержит пробелы.

к этой команде PowerShell:

yarn package-common; if ($?) { mi './dist/APP® TV.wgt' "./package/$(yarn -s filename)" }

Примечание:

  • Начиная с v6.2.0, в PowerShell отсутствуют операторы && и || в Bash-стиле, поэтому использование if ($?) для явной проверки успешного выполнения предыдущей команды - см. это предложение на GitHub для поддержки PowerShell && и || тоже.

  • mi - это встроенный псевдоним для командлета Move-Item.

  • Хотя имеет смысл также вызывать ваши скрипты из PowerShell , это не является обязательным требованием - вызов из cmd.exe или командный файл тоже будет работать.

  • Чтобы начать работу с PowerShell Core, см. Обучение PowerShell ; также http://hyperpolyglot.org/shell сопоставляет синтаксис оболочек, подобных POSIX, таких как Bash, с синтаксисом cmd.exe и PowerShell в сжатой табличной форме.

...