【问题标题】:Grunt and NPM, package all production dependenciesGrunt 和 NPM,打包所有生产依赖
【发布时间】:2016-04-06 10:02:44
【问题描述】:

我不确定 NPM 安装依赖项的方式何时发生变化。
在过去,我记得如果在我的project.json 中我依赖于“abc”,而后者又依赖于“xyz”,那么npm install 将导致如下结果:

package.json
node_modules/
    abc/
        node_modules/
            xyz/
    some-dev-dep/

在打包我的节点项目以供 AWS Lambda 使用时,我必须包含 node_modules 结构(减去那里的任何开发依赖项)。我会使用 Grunt 进行打包,所以我写了这个方便的东西来帮助我将所有生产依赖项放入这个 zip(提取我的 gruntfile.js 的一部分):

function getDependencies(pkg) {
    return Object.keys(pkg.dependencies)
        .map(function(val) { return val + '/**'; });
}

var config = {
    compress: {
        prod: {
            options: {
                archive: 'public/lambda.zip'
            },
            files: [
                { src: 'index.js', dest: '/' },
                { expand: true, cwd: 'node_modules/', src: getDependencies(pkg), dest: '/node_modules' }
            ]
        }
    }
};

这会起作用,因为我的依赖项的依赖项是嵌套的。
最近(或者可能不是最近)这种情况发生了变化(我不确定我何时使用非常旧版本的 NPM 并最近对其进行了更新)。
现在,如果我依赖“abc”,而后者又依赖于“xyz”,我将得到:

node_modules/
    abc/
    xyz/
    some-dev-dep/

如您所见,我仅获取生产依赖项的方法行不通。
有没有什么简单的方法可以在 grunt 作业中仅获取生产依赖项列表(以及子依赖项)?
我可以使用递归函数扫描我的依赖项,然后检查这些文件的project.json 文件,然后搜索子依赖项等。这种方法看起来很麻烦,这可能是许多项目的常见场景......

【问题讨论】:

  • 使用 NVM,以便在安装依赖项时可以使用 NPM v2。然后,您将拥有 node_modules 目录的旧嵌套结构,并且您的 grunt 脚本将再次运行。

标签: node.js npm gruntjs npm-install


【解决方案1】:

这是一个返回生产依赖模块名称数组的函数。 (注意:您可能需要在项目中本地安装“npm”模块才能使其正常工作。)

/**
 * Returns an array of the node dependencies needed for production.
 * See https://docs.npmjs.com/cli/ls for info on the 'npm ls' command.
*/
var getProdDependencies = function(callback) {
  require('child_process').exec('npm ls --prod=true --parseable=true', undefined,
      function(err, stdout, stderr) {
        var array = stdout.split('\n');
        var nodeModuleNames = [];

        array.forEach(function(line) {
          var index = line.indexOf('node_modules');
          if (index > -1) {
            nodeModuleNames.push(line.substr(index + 13));
          }
        });

        callback(nodeModuleNames);
      });
};

【讨论】:

  • 这正是我需要的,ls --prod=true --parseable=true。谢谢。
  • @psulek,很高兴它对您有所帮助。
【解决方案2】:

此更改是随着 npm 3 的发布而引入的(请参阅 npm v3 Dependency Resolution)。

完全不清楚为什么需要使用 Grunt。如果您只想获取生产依赖项,您可以简单地运行:

npm install --production

使用--production 标志,将忽略所有开发依赖项。如果NODE_ENV 环境变量设置为'production',也是如此。

【讨论】:

  • 我知道我可以运行它,但我不能用它来获取我的 Grunt 工作中的仅生产依赖项。现在,我将要压缩/rpm 的文件复制到 dist/ 目录并在那里运行 npm install --production,然后 Grunt 将打包成 zip 和/或 RPM。
猜你喜欢
  • 2019-04-16
  • 2018-01-26
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多