ChatGPT解决这个技术问题 Extra ChatGPT

如何发布带有分发文件的 npm 包?

我想发布一个包含我的源代码和分发文件的 npm 包。我的 Github 存储库包含 src 文件夹,其中包含 JavaScript 源文件。构建过程会生成包含分发文件的 dist 文件夹。当然,dist 文件夹没有签入 Github 存储库。

如何以当有人执行 npm install 时获得 srcdist 文件夹的方式发布 npm 包?目前,当我从我的 git 存储库运行 npm publish 时,它只会发布 src 文件夹。

我的 package.json 看起来像这样:

{
  "name": "join-js",
  "version": "0.0.1",
  "homepage": "https://github.com/archfirst/joinjs",
  "repository": {
    "type": "git",
    "url": "https://github.com/archfirst/joinjs.git"
  },
  "main": "dist/index.js",
  "scripts": {
    "test": "gulp",
    "build": "gulp build",
    "prepublish": "npm run build"
  },
  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  }
}

M
Mario Tacke

当您 npm publish 时,如果您没有 .npmignore 文件,npm 将使用您的 .gitignore 文件(在您的情况下,您排除了 dist 文件夹)。

要解决您的问题,请根据您的 .gitignore 文件创建一个 .npmignore 文件,不要忽略 dist 文件夹

酸味:https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package


感谢您的快速回复。您的回答当然是正确的,但现在我将采用 Eugene 建议的“文件”方法,因为在我看来它更直接。请在他的回复下查看我的详细评论。
a
ankon

查看 package.json 文件 https://docs.npmjs.com/files/package.json#files 的“文件”字段

从文档中:

“文件”字段是要包含在项目中的文件数组。如果您在数组中命名一个文件夹,那么它还将包括该文件夹内的文件。 (除非它们会被另一条规则忽略。)


我很想知道“文件”字段是否覆盖 .gitignore.npmignore (在我阅读文档时似乎没有)-@Naresh 请告诉我们哪种方式效果很好。
“文件”确实忽略了.gitignore。我的 .gitignore 中有“dist”,但包含在“文件”中,并且该文件夹正在发布到 npm。 “文件”似乎是几个流行的包(如 expess 和 bluebird)的发布方式(而还有其他包使用 .npmignore 方法)。现在,我将使用“文件”,因为它似乎是一种更直接的方式来说明要发布的内容。但是感谢你们两位今天至少将我对 npm 的了解增加了两次!
值得注意的是,如果指定了“文件”,那么只有那些文件是包含在您的项目中的唯一文件(除了不能排除的文件,如 package.json 等)
C
Ciro Santilli Путлер Капут 六四事

如何使用脚本中的数据文件的最小示例

另一个常见用例是拥有脚本需要使用的数据文件。

这可以通过使用以下提到的技术轻松完成:In node.JS how can I get the path of a module I have loaded via require that is *not* mine (i.e. in some node_module)

完整示例可在以下位置找到:

来源:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/008bd8000234d74e00845939ea6c47d302a26706/npm/data-files

发表:https://www.npmjs.com/package/cirosantilli-data-files

使用此设置,文件 mydata.txt 会在安装后放入 node_modules/cirosantilli-data-files/mydata.txt,因为我们已将其添加到 package.jsonfiles: 条目中。

然后,我们的函数 myfunc 可以通过使用 require.resolve 找到该文件并使用其内容。当然,它也只适用于可执行文件 ./cirosantilli-data-files

包.json

{
  "bin": {
    "cirosantilli-data-files": "cirosantilli-data-files"
  },
  "license": "MIT",
  "files":  [
    "cirosantilli-data-files",
    "mydata.txt",
    "index.js"
  ],
  "name": "cirosantilli-data-files",
  "repository": "cirosantilli/linux-kernel-module-cheat",
  "version": "0.1.0"
}

我的数据.txt

hello world

index.js

const fs = require('fs');
const path = require('path');

function myfunc() {
  const package_path = path.dirname(require.resolve(
    path.join('cirosantilli-data-files', 'package.json')));
  return fs.readFileSync(path.join(package_path, 'mydata.txt'), 'utf-8');
}
exports.myfunc = myfunc;

cirosantilli 数据文件

#!/usr/bin/env node
const cirosantilli_data_files = require('cirosantilli-data-files');
console.log(cirosantilli_data_files.myfunc());

如果您想要生成分布式文件的相对路径,则 is-installed-globally 软件包非常有用,具体取决于它们是本地安装还是全局安装:How to tell if npm package was installed globally or locally