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


125

我想发布一个包含我的源代码和分发文件的npm软件包。我的Github存储库包含src包含JavaScript源文件的文件夹。生成过程将生成dist包含分发文件的文件夹。当然,该dist文件夹不会签入Github存储库。

我该如何发布npm软件包,以使某人这样做npm install时他们srcdist文件夹一样好?当前,当我npm publish从git存储库运行时,它只会导致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": {
    ...
  }
}

Answers:


101

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

从文档中:

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


3
我很想知道“文件”字段是否覆盖.gitignore.npmignore(当我阅读文档时似乎没有)-@Naresh请告诉我们哪种方法可以正常工作。
topheman

8
“文件”确实忽略了.gitignore。我的.gitignore文件中包含“ dist”,但包含在“文件”中,并且该文件夹正在发布到npm。“文件”似乎是几种流行的软件包(如expess和bluebird)的发布方式(而其他软件包则使用.npmignore方法)。现在,我将使用“文件”,因为它似乎是表达要发布内容的更直接的方法。但是,感谢你们俩今天至少两次提高了我对npm的了解!
Naresh

3
值得注意的是,如果指定了“文件”,那么只有那些文件才是项目中包含的唯一文件(除了package.json等不能排除的文件)
bmacnaughton

176

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

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

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


3
感谢您的快速回复。您的回答当然是正确的,但就我而言,我现在将继续使用Eugene建议的“文件”方法,因为在我看来,这是更直接的方法。请在他的回应下查看我的详细评论。
Naresh

3
非常感谢!
Corvid

0

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

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

使用以下提到的技术可以轻松完成此操作: 在node.JS中,我如何获取通过require不是*我的(即在某些node_module中)加载的模块的路径

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

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

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

package.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"
}

mydata.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如果要生成分布式文件的相对路径(取决于文件是本地安装还是全局安装),则该软件包很有用:如何确定npm软件包是全局安装还是本地安装

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.