如何使用TypeScript在输出目录中包含node_modules

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)

如何实现呢?

非常感谢!

Peo*_*are 6

为此,我创建了一个简单的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和平台无关


Ser*_*erJ 6

此解决方案是对幼稚的“复制整个文件夹”解决方案的改进。它仅将需要的依赖项和/或 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)


Bra*_*son 5

您应该可以仅cp将目录放在上面。如果要使其自动化,可以在package.json中的npm脚本中包装tsccp

{
    "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命令会自动运行为好。

  • 但是,如果您只想要`dependencies`而不是`devDependencies`怎么办? (4认同)

Ker*_*ney 5

我比接受的解决方案更喜欢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)

  • 不要忘记锁定文件! (6认同)
  • 非常好的方法,谢谢。只需补充一件事。您可以在子 shell 中运行 install 命令(将命令括在括号中)以避免 cd 命令更改您的目录。`“postbuild”:“cp package*.json dist &amp;&amp; (cd dist &amp;&amp; npm ci --omit=dev --ignore-scripts)”` (2认同)