我有一个项目,其中包含一个gulp任务,用于在名为dist
的目录中构建和打包源并发布。我的目标是将它作为npm包发布,但只发布我的dist文件夹。 npm documentation表示我可以使用files
标记指定要导出的文件。有用。但是,文档也说:
如果您在数组中命名文件夹,那么它也将包含这些文件 在那个文件夹里面
结果是一个npm包,node_modules看起来像:
但是我想在包的根目录下看到我的所有文件(没有dist
文件夹)。我的index.js
文件位于dist
文件夹中,但应该是root用户。我已尝试将标记files
设置为/dist/**/*
,但它无效。
我怎样才能实现它?
答案 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方法,实现此目标的自然方法是发布要作为根目录的文件夹。有几种方法可以完成此操作,具体取决于您要使用的最终环境:
npm publish dist
。npm install relative/path/to/dist
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)
我通过执行以下操作来实现这一点:
package.json
设置为 private
。所以我不能用 npm publish
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'\")"
}
}