如何在其中的包中指定的纱线工作区中安装可执行文件?

Posted

技术标签:

【中文标题】如何在其中的包中指定的纱线工作区中安装可执行文件?【英文标题】:How to install an executable in yarn workspace that is specified in a package inside of it? 【发布时间】:2021-10-09 01:53:21 【问题描述】:

给出以下文件夹结构和文件:

.
├── package.json
└── scripts
    ├── hello-word.js
    └── package.json
// package.json

  "name": "yarn-bin",
  "version": "1.0.0",
  "private": true,
  "license": "ISC",
  "workspaces": [
    "scripts"
  ]

// scripts/package.json

  "name": "@yarn-bin/scripts",
  "version": "1.0.0",
  "license": "ISC",
  "bin": 
    "hello-world": "./hello-world.js"
  

// scripts/hello-world.js
#!/usr/bin/env -S npx node

console.log("Hello World")

这是一个非常简单的yarn workspace 设置,其中在工作区包中指定了一个可执行文件(scripts/package.json 中的"bin")。 执行./hello-world.js 工作得很好(之前的chmod +x hello-world.js)。

问题

是否可以在工作区本身中安装此可执行文件?

(分解:我想从工作区的任何地方执行脚本,例如使用npx hello-world

【问题讨论】:

如果您将 package.json 中带有 bin 键的脚本添加到工作区文件夹中,您将能够通过 yarn hello-worldnpm run hello-world 使用它 但是在这种情况下你的哈希爆炸应该是#!/usr/bin/env node 【参考方案1】:

就像我在 cmets 中所说的,你在这里得到的几乎是完整的。 您的文件名中确实有错字,但我认为这是您将其复制到 SO 时发生的错字。 我确实更改了hash bang 以确保您通过节点运行它。

您不能通过 npx 运行它,因为 npx 将联机并查看注册表。

.
├── package.json
└── scripts
    ├── hello-world.js # not "hello-word.js"
    └── package.json

package.json:


  "name": "yarn-bin",
  "version": "1.0.0",
  "private": true,
  "license": "ISC",
  "scripts": 
    "hello": "yarn hello-world"
  ,
  "workspaces": [
    "scripts"
  ]

scripts/package.json


  "name": "@yarn-bin/scripts",
  "version": "1.0.0",
  "license": "ISC",
  "bin": 
    "hello-world": "./hello-world.js"
  

还有script/hello-world.js

#!/usr/bin/env node

console.log("Hello World")

在根文件夹中运行 yarn hello 的设置将产生:

$ yarn hello
yarn run v1.22.10
$ yarn hello-world
$ /path/to/folder/node_modules/.bin/hello-world
Hello World
✨  Done in 0.25s.

虽然我在根 package.json 中添加了一个 npm 脚本,但您也可以通过在项目中的任何位置运行 yarn hello-world 来执行 bin。

【讨论】:

哇,乍一看这不起作用,因为我需要先删除 node_modules 并运行 yarn install。似乎yarn install 没有获取在package.jsonbin 部分中指定的文件更改。有没有办法告诉yarn 也检查bin 文件是否已更改?此外,我实际上在我的脚本中使用了#!/usr/bin/env -S npx esr#!/usr/bin/env -S npx ts-node。真的没有办法用npx 执行脚本吗?这里还有其他选择吗?我想让所有开发人员的这个过程变得非常简单,而不需要任何令人生畏的额外步骤。 我对 npx 了解不够,但据我了解,它是用来获取未安装的东西的。运行 npm 脚本比运行 npx 脚本差多少?此外,如果我对hello-world.js 文件进行更改,我可以在运行yarn helloyarn hello-world 时立即看到这些更改。 问题不在于npxnpm script,而是需要全局安装cli(此处为nodeesrts-cnode)。 npx 先在当前项目中查找可执行文件,然后再全局查找。您实际上可以使用以下 hash-bang 来完成这项工作:#!npx esr。这需要您在本地安装软件包,例如yarn add esbuild-runner esbuild。我还注意到代码的更改会立即生效,但更改 hash-bang 需要您先删除 node_modules 然后运行 ​​yarn install

以上是关于如何在其中的包中指定的纱线工作区中安装可执行文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .vbs 文件保存具有在电子表格中指定的名称的文件

如果满足另一个中指定的条件,则更新查询在其中一个中更新数据

yarn berry foreach 工作区未按 package.json 中指定的顺序构建包

如何删除PDF文档中指定的一页文件?

用另一个文件中指定的值替换字段

linux下如何提取日志中指定的一段内容?100分急求!!!