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

时间:2016-12-12 21:00:01

标签: node.js typescript npm 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

如何实现它?

非常感谢!

6 个答案:

答案 0 :(得分:7)

我更喜欢Peopleware's解决方案,而不是公认的解决方案,但是您甚至不需要为此而烦恼。您可以在package.json中简单地做到这一点:

{
  "scripts": {
    "build": "tsc <your command line options>",
    "postbuild": "cp package.json dist/package.json && cd dist && npm install --only=production"
  }
}

您可以使用静态资产(例如图片)或不使用以下内容:

"copy-statics": "cp -r static dist/static"

答案 1 :(得分:5)

您应该只能cp目录。如果要自动化它,可以将你的tsccp调用包装在package.json中的npm脚本中:

{
    "scripts": {
        "build": "tsc <your command line options>",
        "postbuild": "cp -R node_modules lib/node_modules"
    }
}

然后当您使用npm run build时,您的cp命令也会自动运行。

答案 2 :(得分:2)

为此,我创建了一个简单的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']
        }));
});

<小时/>

package.json

...
"scripts": {
  "build:prod": "tsc && gulp"
}
"devDependencies": {
  "gulp": "^3.9.1",
  "gulp-install": "^0.6.0",
},
...

这样我就可以运行npm run build:prod将TypeScript源转换为PROD_DEST gulppackage.json复制到该文件夹​​中并在其中运行npm install --only=production,其中仅安装运行时依赖项
此方法清除< / strong>如果你有很多devDependencies和平台无关

答案 3 :(得分:1)

此解决方案是对朴素解决方案的改进,该解决方案包括复制和粘贴整个node_modules文件夹。此外,它不会在目标文件夹中重新安装软件包,因为我们会将deps和/或devDeps从源node_modules复制粘贴到目标文件夹

我们将使用npm ls以树形形式列出已安装的软件包。请注意,默认格式输出包含多余的信息,并且包可以列出多次。因此,我们使用--parseable标志。

$ npm ls --parseable                                           
/home/code
/home/code/node_modules/mongodb
/home/code/node_modules/bson
...

您只能分别使用--only prod--only dev列出依赖项或devDependencies

我们将前面的命令和一些bash工具放在一起。

mkdir -p lib/node_modules
npm ls --only prod --parseable | tail -n +2 | xargs -I % cp -r % lib/node_modules

确保目标文件夹已经存在,否则第一个软件包将不在其自己的文件夹中。
我们跳过第一行,因为它不是依赖项。

答案 4 :(得分:0)

这不是最优雅的解决方案,但是我可以通过将package.json复制到/dist文件夹并运行yarn install来做到这一点。构建脚本如下所示:

  1. tsc-> ts文件放入/dist
  2. package.json(使用ts-node)复制到/dist
  3. ./src/views复制到/dist/views(用于Express)
  4. cd ./dist然后yarn install

答案 5 :(得分:0)

您可以仅使用jenkins post build操作并定义如下

cp -R target/classes/static ../../../uistatic/dev

您可以选择自己的路径。