npm link 不关心 package.json 或 .npmignore 中的 "files"

npm link does not care for "files" in package.json or .npmignore

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

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

例如:

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]",你会期望只有 lib 出现在 ~/projects/node-bloggy 之后 运行 "npm link redis",但事实并非如此。

旁白: 我喜欢 node 和 npm,但是如果你查看 node 模块中的内容,就会发现自述文件中使用了很多无关文件,例如 PNG。因此,模块大得离谱。

更新:

npm install <path>

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

示例:

如果您需要一个已发布的模块来测试此场景,我最近发布了没有依赖项的 num2cheque。你会看到,如果你使用

从 npm 注册表安装它
npm install num2cheque

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

"files": [lib]

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

解决方法:npm install GIT 回购 URL

你可能想从 GIT 仓库安装一个包,例如

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

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


背景

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

npm link 不是 通过将包复制到目标文件夹来实际安装包。

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

中指定的那些

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

First, npm link in a package folder will create a symlink in the global folder {prefix}/lib/node_modules/ that links to the package where the npm link command was executed. (see npm-config for the value of prefix). It will also link any bins in the package to {prefix}/bin/{name}.

Next, in some other location, npm link package-name will create a symbolic link from globally-installed package-name to node_modules/ of the current folder.

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

"What’s a Symlink?"你可能会问:

a symbolic link (also symlink or soft link) is a term for any file that contains a reference to another file or directory in the form of an absolute or relative path and that affects pathname resolution.

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

如果您担心在硬盘上使用 space,请不要担心 - 没有任何内容被复制或重复,只有 linked(就像 linking 到维基百科一样复制它,它实际上节省了 space)

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

npm install 与包的路径也会创建一个符号 link 到有问题的包。一个有用的场景可能是一个仍在开发中的模块。

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

这将在您的 node-bloggy 项目的 node_modules 下创建一个符号 link。