您可能已经看到了这样的NPM软件包,可以直接在外壳上执行。让我们以cowsay软件包为例。如果您在终端中运行npx cowsay Mooo!
,您会看到这样的输出:
另外,您可以将此软件包作为全局依赖关系安装,然后运行:
$ npm install -g cowsay
$ cowsay Mooo!
希邦
我们可以使用cowsay
命令在终端上运行它的原因是因为其可执行文件添加到我们的PATH
中。您可以使用which
命令查看其位于位置:
$ which cowsay
/usr/bin/cowsay
如果您使用长列表格式进行检查,您会注意到,它实际上是指JavaScript文件的符号链接:
$ ls -l /usr/bin/cowsay
/usr/bin/cowsay -> ../lib/node_modules/cowsay/cli.js
但是,bash如何知道要使用哪个解释器来执行此文件?
好吧,如果您看到此JavaScript文件的第一行,您会注意到输出如下:
$ head -1 /lib/node_modules/cowsay/cli.js
#!/usr/bin/env node
此行称为hash bang(或shebang),在脚本中用于指示在UNIX/Linux操作系统下执行的解释器。简而言之,这是bash的指令,告诉其使用指示的解释器执行文件。
让我们创建一个没有扩展名的文件,然后尝试使用shell使用shell:
$ touch my_script
$ echo "const os = require('os'); console.log(os.cpus().length);" >> my_script
$ chmod u+x my_script
$ ./my_script
./my_script: line 1: syntax error near unexpected token `('
./my_script: line 1: `const os = require('os'); console.log(os.cpus().length);'
如果您看到这些错误,那么您在正确的轨道上。默认情况下,外壳将尝试使用/usr/bin/bash
解释器来解释此文件,如果您不相信我,只需运行bash my_script
即可获得相同的结果。
要使用nodejs执行此文件,我们要么需要运行node my_script
,要么需要添加shebang行。让我们做后者。添加Shebang后,您的my_script
文件应该看起来像我的:
#!/usr/bin/node
const os = require('os');
console.log(os.cpus().length);
您可以尝试像以前一样再次运行它,也可以将此文件移至/usr/bin
目录,然后尝试直接在终端上运行它。它将向您显示机器上逻辑CPU内核的数量。对我来说是16:
$ sudo mv my_script /usr/bin/my_script
$ my_script
16
HI-MOM CLI
现在,让我们将著名的hi-mom
NPM软件包转到CLI应用程序。 firsly,让我们克隆存储库并将其打开在我们的编辑中:
$ git clone https://github.com/tsivinsky/hi-mom.git
$ cd hi-mom && code .
让我们在项目文件夹的根上创建一个cli.js
文件,然后添加以下代码作为其内容:
#! /usr/bin/node
import { hiMom } from "./index.js";
const name = process.argv[2];
const lang = process.argv[3] || "en";
console.log(hiMom(name, lang));
还将以下行添加到package.json
文件中以显示NPM在哪里查找可执行文件:
...
"bin": "./cli.js",
...
我们还需要确保此文件对所有用户和组都执行权限:
$ chmod +x cli.js
现在,如果运行npx hi-mom
,您会看到所需的输出:
要将其称为NPX,我们需要在全球安装它,因此需要将该软件包发布到NPM注册表。但是,要保持简单,我们可以为其创建一个符号链接。只需在项目文件夹的根部运行npm link
。
然后您可以到处运行它:
结论
我希望这篇文章对此有所帮助。如果您有任何疑问或矛盾,请发表评论,如果您喜欢这篇文章,则喜欢并分享。感谢您的阅读。
资源
https://docs.npmjs.com/cli/v9/configuring-npm/package-json#bin
https://docs.npmjs.com/cli/v9/configuring-npm/folders#description
https://www.baeldung.com/linux/shebang