17

我的目标是在发布节点模块之前指定哪些文件将包含在我的节点模块中,并能够在本地测试安装。使用 package.json 中的“文件”,如果我发布我的包并安装它,那么我只会得到“文件”中指定的内容。

当我使用 npm 链接时,情况并非如此。无论是 package.json 中的“文件”还是 .npmignore,npm 链接似乎总是给我每个文件。我怎样才能像这样在本地测试我的模块安装?

前任:

cd ~/projects/node-redis    # go into the package directory
npm link                    # creates global link
cd ~/projects/node-bloggy   # go into some other package directory.
npm link redis              # link-install the package

如果 ~/projects/node-redis 在它的 package.json 中有 "files: [lib]",你会期望在运行 "npm link redis" 之后只有 lib 出现在 ~/projects/node-bloggy 中,但这不是案子。

顺便说一句:我喜欢 node 和 npm,但是如果您查看 node 模块中的内容,就会发现自述文件中使用了很多无关的文件,例如 PNG。因此,模块非常庞大。

更新:

npm install <path>

根据此处的答案和stackoverflow上的其他人,似乎尊重package.json中的“文件”。我不能代表其他系统,但在 Fedora Linux 上使用 npm v 6.9.0,这不起作用,因为所有文件仍然被复制。

例子:

如果您需要一个已发布的模块来测试此场景,我最近发布了没有依赖项的 num2cheque。如果你从 npm 注册表安装它,你会看到

npm install num2cheque

您没有收到我在本地拥有的测试目录,因为我在 package.json 中指定

"files": [lib]

将测试目录添加到本地安装,然后尝试使用带有路径的 npm link 或 npm install ,您将看到现在包含测试目录。希望能说明问题。

4

1 回答 1

13

解决方法:npm installGIT 存储库 URL

您可能想从 GIT 存储库安装一个包,例如

npm install https://github.com/AndreasPizsa/parse-decimal-number.git

这是npm install尊重files条目的实际值,即使包尚未发布到 npm 存储库。


背景

npm link不复制,它创建一个链接

npm link实际上并没有通过将包复制到目标文件夹来安装包。

相反,它会创建一个指向源文件夹的符号链接,这就是为什么您会看到源文件夹(“node-redis”)中的所有文件,而不仅仅是files.

此行为记录在npm link文档中:

首先,包文件夹中的 npm link 将在全局文件夹 {prefix}/lib/node_modules/ 中创建一个符号链接,链接到执行 npm link 命令的包。(有关前缀的值,请参见 npm-config)。它还将包中的任何 bin 链接到 {prefix}/bin/{name}。

接下来,在其他位置,npm link package-name 将创建一个从全局安装的 package-name 到当前文件夹的 node_modules/ 的符号链接。

https://docs.npmjs.com/cli/link.html

“什么是符号链接?” 你可能会问:

符号链接(也称为符号链接或软链接)是任何文件的术语,它包含以绝对或相对路径形式对另一个文件或目录的引用并影响路径名解析。

https://en.wikipedia.org/wiki/Symbolic_link

如果您担心硬盘空间的使用,请不要担心 - 没有任何内容被复制或复制,只有链接(就像链接到 Wikipedia 不会复制它,它实际上节省了空间)

npm install...本地运行也是如此

npm install使用包的路径也将创建一个指向相关包的符号链接。一个有用的场景可能是仍在开发中的模块。

cd ~/projects/node-bloggy
npm install ~/projects/node-redis

node_modules这将在您的node-bloggy项目中创建一个符号链接。

于 2019-11-08T01:14:03.953 回答