如何npm发布特定文件夹但作为包根目录

时间:2016-08-13 17:16:04

标签: npm package node-modules package.json

我有一个项目,其中包含一个gulp任务,用于在名为dist的目录中构建和打包源并发布。我的目标是将它作为npm包发布,但只发布我的dist文件夹。 npm documentation表示我可以使用files标记指定要导出的文件。有用。但是,文档也说:

  

如果您在数组中命名文件夹,那么它也将包含这些文件   在那个文件夹里面

结果是一个npm包,node_modules看起来像:

generated npm package

但是我想在包的根目录下看到我的所有文件(没有dist文件夹)。我的index.js文件位于dist文件夹中,但应该是root用户。我已尝试将标记files设置为/dist/**/*,但它无效。

我怎样才能实现它?

14 个答案:

答案 0 :(得分:22)

我有同样的愿望,但我认为没有办法只使用npm工具来实现这一点。可以使用另一个脚本/工具来安排您的包。

替代解决方案

目前我正在将package.json复制到dist文件夹中,然后在npm pack文件夹中运行dist。我认为这基本上提供了我们的包装的理想安排。

以下是关于此npm设计的一些相关阅读:Why no Directories.lib in Node

有趣的是,jspm尊重directories.lib中的package.json选项,并在解析npm包时重新排列文件。这一切都是为了我,因为我想构建一个可以被jspm或npm / webpack使用的公共库。

答案 1 :(得分:2)

我强烈建议您使用.npmignore而不是移动或复制内容,特别是如果您使用CI进行部署,只需添加您不想发布的文件。

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

示例:

#tests
test
coverage

#build tools
.travis.yml
.jenkins.yml
.codeclimate.yml

#linters
.jscsrc
.jshintrc
.eslintrc*

#editor settings
.idea
.editorconfig

<强>更新

如果你想使用相同的仓库将你的代码拆分成不同的npm包,我最近碰到了这个项目:Lerna并且看起来非常好。

也许你应该看看

答案 2 :(得分:1)

如果您的项目有git,则可以使用小型技巧。 将下一个脚本添加到package.json

    "prepublishOnly": "npm run build && cp -r ./lib/* . && rm -rf ./lib",
    "postpublish": "git clean -fd",

现在,当您运行publish命令时,npm涉及prepublishOnly。它生成文件并将其保存到lib文件夹(生成脚本取决于您的项目)。下一条命令将文件复制到根文件夹并删除lib。在发布postpublish脚本后,项目将返回到先前的状态。

答案 3 :(得分:1)

您需要发布dist文件夹

根据npm方法,实现此目标的自然方法是发布要作为根目录的文件夹。有几种方法可以完成此操作,具体取决于您要使用的最终环境:

  1. npm publish <folder>从程序包存储库中转到npm注册表,然后在安装其他程序包时将其安装到其他项目中。您的情况应该是npm publish dist
  2. 如果只想在本地使用软件包,请在其他项目中
  3. npm install <folder>。就您而言,您转到另一个项目并运行npm install relative/path/to/dist
  4. npm link将文件夹本地保存在另一个项目的node_modules中,以防您希望原始包中的更改立即反映在其他项目中。就您而言,您首先cd dist并运行npm link,然后转到另一个项目并运行npm link robsonrosa-ui-alert

先决条件:在上述任何情况下,发布/安装/链接之前,您都必须至少将一个正确的dist文件放入package.json文件夹中。就您而言,您必须在package.json文件中将包名称定义为"name": "robsonrosa-ui-alert"。通常,您还需要其他一些文件,例如README.md或LICENSE。

自动化示例

您可以结合使用build脚本和prepare script来自动执行发布过程。此外,您可以保护您的软件包,以防意外发布软件包根文件夹,方法是在软件包仓库根目录中的package.json中放置"private": true字段。这是一个示例:

  "private": true,
  "scripts": {
    "build": "rm -rf dist && gulp build && cat ./package.json | grep -v '\"private\":' > dist/package.json",
    "prepare": "npm run build"
  },

这样,您将不会发布根文件夹,也不会在发布过程中自动生成包并将package.json复制到dist文件夹中。

答案 4 :(得分:1)

如果(我建议)使用semantic-release,请在pkgRoot文件中添加.releaserc.json选项:

{
  "pkgRoot": "dist",
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/npm",
    [
      "@semantic-release/exec",
      {
        "prepareCmd": "npx rjp package.json version nextRelease.version"
      }
    ],
    [
      "@semantic-release/git",
      {
        "assets": ["package.json"]
      }
    ],

  ],
}

这将解决问题。只要确保您的dist文件夹包含一个package.json文件即可。您可以通过在cp脚本中添加postbuild来轻松地做到这一点。同时安装rjp

答案 5 :(得分:1)

这对我有用

npm run build
cp package.json dist
cp .npmrc dist
cd dist
npm publish 

我正在使用 Jenkins 的这些命令来发布包。

答案 6 :(得分:1)

我有一个 Typescript 项目,它编译到一个名为 dist 的文件夹中,我找到了适用于 Windows 的解决方案。

在我的项目根目录下的 package.json 中:

  "scripts": {
    "prepub": "copy package.json dist",
    "pub": "cd dist & npm publish",
    "postpub": "cd dist & del package.json"
  }

这些脚本允许我通过运行 dist 将我的 npm run pub 文件夹发布为我的包的根目录。

  • prepub 将我的 package.json 复制到 dist 文件夹中。
  • pub 将工作目录更改为 dist/,然后运行 ​​npm publish
  • postpub 从我的 package.json 文件夹中删除 dist 以确保每次发布都干净利落。

这样,我仍然可以在我的项目根目录中拥有所有相关的配置文件,但我可以在发布之前将它们复制到 dist

同样的方法可能适用于 Mac 或 Linux。

答案 7 :(得分:0)

我有与原始海报(@robsonrosa)类似的问题。在我的情况下,我使用typecript编译到dist目录。虽然我可以将Typescript编译到根目录,但我认为最好的解决方案是在dist目录中生成一个单独的package.json文件。
这类似于@scvnc关于复制package.json的建议,但有一点曲折:

作为打包过程的一部分,您应该为该软件包生成package.json,该软件包基于但与您根目录中的主package.json文件不同

基本原理:

  • package.json根文件是开发文件。它可能包含对程序包用户无用的脚本或开发依赖关系,但可能会给您带来安全隐患。您的打包过程可能包括将产品信息从产品package.json中剥离的代码。
  • 您可能希望将程序包部署到可能需要不同程序包文件的不同环境中(例如,您可能希望具有不同的版本或依赖项)。

答案 8 :(得分:0)

这对我来说很好。

cd TMPDIR; npm pack /path/to/package.json

Tarball将在TMPDIR目录中创建。

答案 9 :(得分:0)

这是我认为最干净的另一种方法。都是基于配置的,无需移动文件或在构建和打包脚本中指定路径:

package.json 指定主文件。

{
    "main": "lib/index.js",
}

一些其他打字稿选项:

  • 指定rootDir。此目录将包含所有源代码,并且其中应包含index文件(或可以在package.json中用作主文件的其他文件)。
  • 指定outDir。这是您的tsc命令生成的地方

tsconfig.json

{
    "compilerOptions": {
        "rootDir": "src",
        "outDir": "lib",
    },
    ...

}

答案 10 :(得分:0)

只需创建一个 .npmignore 文件并将以下内容添加到其中:

*.*
!dist/*

答案 11 :(得分:0)

选项1:导航到该文件夹​​,然后执行“ npm publish”。命令

选项2:运行npm publish / path / directory

答案 12 :(得分:0)

我通过执行以下操作来实现这一点:

  1. 我将我的 package.json 设置为 private。所以我不能用 npm publish
  2. 发布我的包
  3. 我通过以下步骤创建了一个 gulpfile

import gulp from 'gulp';
import shell from 'gulp-shell';
import replace from 'gulp-replace';

const compile = () => gulp.src('package.json').pipe(shell('npm run compile'));

const copy = () => gulp.src(['readme.md']).pipe(gulp.dest('dist'));

const update = () =>
  gulp.src('package.json').pipe(replace('"private": true,', '"private": false,')).pipe(gulp.dest('dist'));

const publish = () => gulp.src('package.json').pipe(shell('cd dist && npm publish'));

export default gulp.series(compile, copy, update, publish);

答案 13 :(得分:0)

这是简单的 package.json 解决方案:

{
    "scripts": {
      "pack": "mkdir -p dist && cp package.json dist/package.json && npm pack ./dist",
      "pub": "npm publish $(node -p \"p=require('./package.json');p.name+'-'+p.version+'.tgz'\")"
    }
}