我正在使用"bin";npm包的属性,所以我制作了一个包含两个文件的文件夹
- package.json
- index.js
这是包.json
{
"name": "foo",
"version": "1.0.0",
"description": "",
"bin": "./index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
和index.js
#!/usr/bin/env node
console.log("hello, world!")
现在,如果我运行npx .
来测试是否一切正常,npx说
Need to install the following packages:
file:
Ok to proceed? (y)
我回答y
,然后安装并执行命令,因此hello, world!
打印在控制台上
但现在,如果我将文件名从index.js
更改为main.js
(并相应地更改package.json中的"bin":
条目(,则npx .
将停止工作。
我错过了什么?
有没有办法删除或更新以这种方式自动安装的旧软件包?
编辑
我在我的主目录中发现了一些有趣的东西:如果我用调试器运行npx .
(幸运的是vscode调试终端(,我可以按照调用堆栈发现包的路径!
在我的例子中是~/.npm/_npx/0b61241d7c17bcbb/
,在该文件夹中,我可以找到一个只有";依赖关系";表示的条目,并且表示的单个依赖项是my";foo";包装
$ ls -l ~/.npm/_npx/0b61241d7c17bcbb/
total 12
drwxr-xr-x 3 anto anto 4096 10 apr 11.34 node_modules
-rw-r--r-- 1 anto anto 75 10 apr 11.34 package.json
-rw-r--r-- 1 anto anto 540 10 apr 11.34 package-lock.json
$ cat ~/.npm/_npx/0b61241d7c17bcbb/package.json
{
"dependencies": {
"foo": "file:../../../Projects/test-npm"
}
}
$ ls -l ~/.npm/_npx/0b61241d7c17bcbb/node_modules/
total 0
lrwxrwxrwx 1 anto anto 31 10 apr 11.34 foo -> ../../../../Projects/test-npm
然而,这并不能回答我的问题:为什么如果我将文件名从index.js更改为main.js(以及相应的package.json(,即使~/.npm/_npx/0b61241d7c17bcbb/node_modules/foo
是符号链接,包也会被破坏?
我想你基本上已经明白了:(
npx将缓存CCD_ 11中的包。如果它找到了要执行的包,它将使用缓存中的信息,而不是尝试下载(或使用本地文件(。
在您的案例中,如果您查看~/.npm/_npx/0b61241d7c17bcbb/package-lock.json
内部,您会注意到它仍然有指向旧文件的bin
(在您的实例中为index.js
(
你也会有~/.npm/_npx/0b61241d7c17bcbb/.bin/
里面有一个死链接。最后是~/.npm/_npx/0b61241d7c17bcbb/.package-lock.json
,还有你的旧文件名。
删除缓存目录,它将重新开始工作。