我正在向NPM发布图书馆。
当我构建库时,生成的工件将作为dist
放置在项目根目录中的index.js
文件夹中。
当用户从NPM安装时,我希望index.js
出现在node_modules
文件夹中创建的文件夹的 root 中。目前,它仍保留在名为dist
。
我该怎么做?
我的packages.json:
{
"name": "my-package",
"version": "0.0.9",
"files": ["dist/*"],
"main": "index.min.js",
"private": false,
"dependencies": {},
"devDependencies": {},
"repository": "git@github.com:username/my-package.git"
}
答案 0 :(得分:2)
我有完全相同的问题。
我解决了这个问题,不是通过复制文件,而是将我需要的文件复制到./dist/
文件夹中,然后从那里做npm publish
; NPM然后将该文件夹视为一个完整的包,一切都很好。我需要从根文件夹复制的唯一文件是:
package.json
README.md
由于我们要在发布之前将这些文件复制到./dist/
文件夹中,因此我们不希望package.json
文件引用./dist/
。因此,请完全删除package.json
的{{1}}条目,因为我们无需告诉它我们将采用哪些文件 - 我们将把files
文件夹中的所有文件都删除。我正在使用TypeScript,因此我还有一个./dist/
条目,并且再次没有引用typings
。
./dist/
现在进行发布步骤。我构建了一个gulp任务,它将为我执行发布,使其很好并且自动化(除了增加包版本#)。
从gulp我将使用Node的spawn()来启动npm进程。但是,因为我实际上在Windows上使用“cross-spawn”,而不是普通的内置Node.js spawn(当我在路径中有空格时,我学到了很难的方法!)
这是我的gulp文件,删除了TypeScript位:
{
"name": "my-package",
"version": "0.0.9",
"main": "index.min.js",
"typings": "index.d.ts",
"private": false,
"dependencies": {},
"devDependencies": {},
"repository": "git@github.com:username/my-package.git"
}
注意当我们调用spawn()时,我们传入第三个参数,即参数。这里的主要条目是var gulp = require('gulp');
var del = require('del');
var spawn = require('cross-spawn'); // WAS: require('child_process').spawn;
var config = {
src: { tsFiles: './src/**/*.ts' },
out: { path: './dist/' }
}
gulp.task('clean', () => {
return del('dist/*');
});
gulp.task('build', ['clean'], () => {
....
});
gulp.task('publish', ['build'], (done) => {
// Copy the files we'll need to publish
// We just use built-in gulp commands to do the copy
gulp.src(['package.json', 'README.md']).pipe(gulp.dest(config.out.path));
// We'll start the npm process in the dist directory
var outPath = config.out.path.replace(/(\.)|(\/)/gm,'');
var distDir = __dirname + '\\' + outPath + '\\';
console.log("dist directory = " + distDir);
// Start the npm process
spawn('npm', ['publish'], { stdio:'inherit', cwd:distDir } )
.on('close', done)
.on('error', function(error) {
console.error(' Underlying spawn error: ' + error);
throw error;
});
});
,它告诉spawn从./dist/目录运行npm进程。因为使用spawn会导致问题,我已经挂钩到spawn错误处理。在我使用cwd:distDir
进行故障排除时,我发现以下StackOverflow文章非常有用。
这就像一个魅力;我发布的包中包含根目录中的所有文件,并且spawn()
文件夹未发布。