使您的NPM软件包可执行
#javascript #node #npm #bash

您可能已经看到了这样的NPM软件包,可以直接在外壳上执行。让我们以cowsay软件包为例。如果您在终端中运行npx cowsay Mooo!,您会看到这样的输出:

output of running cowsay on terminal which shows ascii cow saying 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,您会看到所需的输出:

result of calling npx hi-mom on the terminal which says hi mom

要将其称为NPX,我们需要在全球安装它,因此需要将该软件包发布到NPM注册表。但是,要保持简单,我们可以为其创建一个符号链接。只需在项目文件夹的根部运行npm link

然后您可以到处运行它:

running hi-mom after using npm link on terminal

结论

我希望这篇文章对此有所帮助。如果您有任何疑问或矛盾,请发表评论,如果您喜欢这篇文章,则喜欢并分享。感谢您的阅读。

资源

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