什么是`npx.`在某个目录中第一次执行时执行

  • 本文关键字:执行 第一次 npx npx
  • 更新时间 :
  • 英文 :


我正在使用"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,还有你的旧文件名。

删除缓存目录,它将重新开始工作。

最新更新