powershell 如何使用Bash shell命令使npm项目在Windows上工作?

ccrfmcuu  于 2023-10-18  发布在  Shell
关注(0)|答案(2)|浏览(133)

我最近接手的一个项目中有一些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)''

或者更好的是,除了this包之外,还有其他方法可以跨平台实现吗?
目前在powershell中运行yarn包时输出的消息是:

'' was unexpected at this time.
aij0ehis

aij0ehis1#

您在没有 * 特定于平台的 * 脚本的情况下进行跨平台 * 的基本选择是:

*在Windows上也使用Bash

  • 从Bash**通过WSL**运行npm脚本,使用现有的Bash命令通常包含在package.json文件中,例如在您的情况下。
  • 或者,安装**Git for Windows后,配置npm使用bash.exe作为调用命令的shell-参见this answer [npm v5.1+]。
    *在所有平台上安装PowerShell (Core)(包括Windows),并
    将命令定义为PowerShell命令**(见下文)[npm v5.1+]。

请注意npm版本要求(版本5.1或更高版本),因为在早期版本中没有使用特定shell(script-shell)的配置选项。运行npm -v获取安装的版本,
npm install -g npm更新,如果可能。

在所有平台上使用npm与PowerShell(Core)[npm v5.1+]:

  • 安装PowerShell Core。
  • 然后配置npm以使用PowerShell(Core)作为shell(需要npm 5.1或更高版本):
  • 对于 * 所有 * 项目(当前用户)或 * 全局 *(所有用户):
npm config set script-shell pwsh [--global]
  • 仅适用于 * 给定项目 *(从该项目的根目录):
npm config set script-shell pwsh --location project

# Equivalent in older npm versions:
npm config set script-shell pwsh --userconfig ./.npmrc
  • 最后,在项目的package.jsonscripts键中,将命令定义为PowerShell命令。

在本案中:
例如,翻译这个Bash命令:

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

注意:我用"代替了'',因为后者更有意义;正如最初写的那样,''实际上被Bash * 丢弃 *,如果命令替换$(yarn -s filename)的结果包含空白,则可能会中断命令。
这个PowerShell命令(v7+):

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

注意事项:

  • mi是PowerShell的Move-Item小程序的内置别名。
  • 虽然从PowerShell* 调用脚本也是有意义的,但这不是必需的-从cmd.exe或批处理文件调用也可以。
  • 要开始使用PowerShell(核心),请参阅Learning PowerShell;此外,http://hyperpolyglot.org/shell以简洁的表格形式将类似POSIX的shell(如Bash)的语法与cmd.exe和PowerShell的语法并列。
92vpleto

92vpleto2#

我要无耻地宣传我对这个问题的解决方案。我也面临着同样的问题,并决定写一个小工具来一劳永逸地解决这个问题。结果是一个小型的Bash解释器,能够在NodeJS可以运行的所有平台上工作,包括Windows。作为一个不错的奖励,它也支持并行运行任务。
简而言之,你可以用bake x替换npm run x,它会工作。在命令之后指定的所有脚本都将并行运行,如果你安装@samvv/bake作为依赖项,你也可以在npm脚本中使用它,如下所示:

{
  "scripts": {
     "watch:compile-tests": "tsc -w",
     "watch:tests": "ava --watch",
     "test": "ava",
     "lint": "tsc --noEmit",
     "prepare": "npm run lint && webpack --mode production",
     "serve": "webpack serve --mode development",
     "lint-while-testing": "bake lint test"
  }
}

你可以找到源代码here,你可以使用npm install -g @samvv/bake安装这个包。请参阅this Medium post以了解有关其工作原理和使用方法的更多信息。
我真的希望这对某人有用!

相关问题