Vla*_*gas 8 node.js npm typescript visual-studio-code
我想知道是否可以在运行tsc命令后将node_modules文件夹复制到输出目录中。
我的情况是我有一个带有TypeScript的项目并使用了一些npm包。而且我需要我的输出目录具有所有npm依赖项,因为我需要对其进行压缩并通过http发送(到AWS Lambda)。
我的项目结构如下:
|-.vscode --> visual studio code
|-lib --> output dir
|-node_modules --> npm dependencies
|-src --> .ts files
|-jsconfig.json
|-tsconfig.json
Run Code Online (Sandbox Code Playgroud)
如何实现呢?
非常感谢!
为此,我创建了一个简单的gulp任务。
gulpfile.js:
var gulp = require('gulp');
var install = require('gulp-install');
const PROD_DEST = '../dist';
gulp.task('default', function () {
return gulp.src(['./package.json'])
.pipe(gulp.dest(PROD_DEST))
.pipe(install({
args: ['only=production']
}));
});
Run Code Online (Sandbox Code Playgroud)
package.json:
...
"scripts": {
"build:prod": "tsc && gulp"
}
"devDependencies": {
"gulp": "^3.9.1",
"gulp-install": "^0.6.0",
},
...
Run Code Online (Sandbox Code Playgroud)
这样我就可以运行npm run build:prod将 TypeScript 源代码转换为PROD_DEST.
gulp将 复制package.json到该文件夹中并npm install --only=production在其中运行,该文件夹仅安装运行时依赖项。
这种方法是清洁的,如果你有很多devDependencies和平台无关。
此解决方案是对幼稚的“复制整个文件夹”解决方案的改进。它仅将需要的依赖项和/或 devDependencies 从源 node_modules 复制粘贴到目标文件夹。仅适用于 POSIX 环境。如果跨平台是强制性的,那么我建议您坚持使用该cp策略或 node-js 脚本。
{
"scripts": {
"build": "tsc <your command line options>",
"postbuild": "out='lib/node_modules' && root=$(npm root) && mkdir -p $out && npm ls --production --parseable | tail --lines=+2 | sed \"s%$root%%\" | cut --delimiter='/' --fields=2 | sort | uniq | xargs -I % cp -r \"$root/%\" $out"
}
}
Run Code Online (Sandbox Code Playgroud)
您可以分别使用命令的--production和--development标志仅列出依赖项或 devDependenciesnpm ls
out='lib/node_modules' \ # output dir relative to package.json
&& root=$(npm root) \ # get path to node_modules dir
&& mkdir -p $out \
&& npm ls --production --parseable \ # (1)
| tail --lines=+2 \ # (2)
| sed "s%$root%%" \ # (3)
| cut --delimiter='/' --fields=2 \ # (4)
| sort | uniq \ # (5) optional
| xargs -I % cp -r "$root/%" $out # (6)
Run Code Online (Sandbox Code Playgroud)
(1)列出包。我们使用npm lswhich 以树的形式列出已安装的包。请注意,默认格式输出包含多余的信息,并且可以多次列出包。因此我们使用--parseable标志。
$ npm ls --parseable
/home/code
/home/code/node_modules/mongoose
/home/code/node_modules/is-typed-array
/home/code/node_modules/is-typed-array/node_modules/es-abstract
...
Run Code Online (Sandbox Code Playgroud)
(2)删除第一个输出行,因为我们不会使用它。这里包is-typed-array有它自己的包es-abstract副本。
/home/code/node_modules/mongoose
/home/code/node_modules/is-typed-array
/home/code/node_modules/is-typed-array/node_modules/es-abstract
...
Run Code Online (Sandbox Code Playgroud)
(3)从每个包路径中删除 node_modules 路径。
/mongoose
/is-typed-array
/is-typed-array/node_modules/es-abstract
...
Run Code Online (Sandbox Code Playgroud)
(4)保留第一个路径成员
/mongoose
/is-typed-array
/is-typed-array
...
Run Code Online (Sandbox Code Playgroud)
(5)去除重复行。此步骤是可选的,但建议使用,因为我们不会多次复制同一个包。但是,它可以减慢整个过程。
mongoose
is-typed-array
...
Run Code Online (Sandbox Code Playgroud)
(6)最后一步:复制。您可以记录执行的操作xargs -t
cp -r /home/code/node_modules/is-typed-array lib/node_modules
cp -r /home/code/node_modules/mongoosee lib/node_modules
...
Run Code Online (Sandbox Code Playgroud)
您应该可以仅cp将目录放在上面。如果要使其自动化,可以在package.json中的npm脚本中包装tsc和cp:
{
"scripts": {
"build": "tsc <your command line options>",
"postbuild": "cp -R node_modules lib/node_modules"
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当你使用npm run build你的cp命令会自动运行为好。
我比接受的解决方案更喜欢Peopleware的解决方案,但是您甚至不需要为此而烦恼。您可以在package.json中简单地做到这一点:
{
"scripts": {
"build": "tsc <your command line options>",
"postbuild": "cp package.json dist/package.json && cd dist && npm install --only=production"
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用静态资产(例如图片)或不使用以下内容:
"copy-statics": "cp -r static dist/static"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5378 次 |
| 最近记录: |