Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Npm仅在开发时安装_Javascript_Node.js_Continuous Integration_Npm - Fatal编程技术网

Javascript Npm仅在开发时安装

Javascript Npm仅在开发时安装,javascript,node.js,continuous-integration,npm,Javascript,Node.js,Continuous Integration,Npm,我有一个npm模块,带有以下package.json { "name": "my-app", "version": "0.0.0", "scripts": { "prepublish": "bower install", "build": "gulp" }, "depend

我有一个npm模块,带有以下
package.json

{
  "name": "my-app",
  "version": "0.0.0",
  "scripts": {
    "prepublish": "bower install",
    "build": "gulp"
  },
  "dependencies": {
    "express": "~4.0.0",
    "body-parser": "~1.0.1"
  },
  "devDependencies": {
    "gulp": "~3.6.0",
    "bower": "~1.3.2"
  }
}
当我将我的应用程序部署到生产环境时,我不想安装
devdependencies
,因此,我运行
npm install--production
。但在本例中,调用了
prepublish
脚本,但不需要调用,因为我在生产中使用CDN链接


如何仅在
npm安装之后调用
postinstall
脚本,而不是在
npm安装--production
之后调用脚本?

我认为您无法根据
--production
参数选择运行哪些脚本。但是,您可以提供一个脚本来测试
NODE_ENV
变量,并且仅在不是“生产”时运行
bower install

如果您始终处于unix-y环境中,可以这样做:

{ 
  scripts: {
    "prepublish": "[ \"$NODE_ENV\" = production ] && exit 0; bower install"
  }
}

这仅在您处于类似unix的环境中时有效:

当使用--production运行安装时,NPM将环境变量设置为“true”。要仅在npm安装未与--production一起运行时运行postinstall脚本,请使用以下代码

"postinstall": "if [ -z \"$npm_config_production\" ]; then node_modules/gulp/bin/gulp.js first-run; fi",

不太依赖于shell的unix特性的解决方案:

  "scripts": {
    "postinstall": "node -e \"process.env.NODE_ENV != 'production' && process.exit(1)\" || echo do dev stuff"
  },

我使用windows、osx和linux,因此我使用非环境特定的解决方案来解决此问题:

在postinstall处理程序中,我执行一个js脚本,该脚本检查process.env.NODE_env变量并执行该工作

在我的特定情况下,我必须仅在development env中执行一个gulp任务:

包的一部分。json

"scripts": {
  "postinstall": "node postinstall"
}
所有postinstall.js脚本

if (process.env.NODE_ENV === 'development') {
  const gulp = require('./gulpfile');
  gulp.start('taskname');
}
gulpfile.js的最后一行

module.exports = gulp;
从gulpfile.js导出gulp很重要,因为所有任务都在特定的gulp实例中。

我正在使用模块。没那么冗长

PS:我还没有在windows上测试它

安装时使用:

npm i if-env
而不是在
package.json
脚本中:

"postinstall-production": "echo \"production, skipping...\"",
"postinstall-dev": "echo \"doing dev exclusive stuff\"",
"postinstall": "if-env NODE_ENV=production && npm run postinstall-production || npm run postinstall-dev"
较新的npm(&Warn)版本包括对
prepare
脚本的支持,该脚本在每次
install
运行后运行,但仅在开发模式下运行。另外,
预发布
也不推荐使用。这就足够了:

{
  scripts: {
    "prepare": "bower install"
  }
}

文档:

因为我有同样的问题而登陆这里。最终得到了一个解决方案,该解决方案可以测试node_模块下是否存在一个包,我知道这个包应该只在开发中可用

{
  "scripts": {
    "postinstall": "bash -c '[ -d ./node_modules/@types ] && lerna run prepare || echo No postinstall without type info'" 
  }
}

这在概念上对我来说很好,因为lerna在这里调用的prepare脚本主要用于ts到js编译。

我有一个更普遍的问题-我想跳过在本地(直接)安装上运行
postinstall
脚本-就像我在开发包并运行
纱线添加--开发我的新依赖项时一样

这就是我想到的。它与npm和纱线一起工作

postinstall.js

const env = process.env;
if (
    // if INIT_CWD (yarn/npm install invocation path) and PWD
    // are the same, then local (dev) install/add is taking place
    env.INIT_CWD === env.PWD ||
    // local (dev) yarn install may have been run
    // from a project subfolder
    env.INIT_CWD.indexOf(env.PWD) === 0
) {
    console.info('Skipping `postinstall` script on local installs');
}
else {
    // do post-installation things
    // ...
}
"script": {
    "postinstall": "node postinstall.js",
    ...
package.json

const env = process.env;
if (
    // if INIT_CWD (yarn/npm install invocation path) and PWD
    // are the same, then local (dev) install/add is taking place
    env.INIT_CWD === env.PWD ||
    // local (dev) yarn install may have been run
    // from a project subfolder
    env.INIT_CWD.indexOf(env.PWD) === 0
) {
    console.info('Skipping `postinstall` script on local installs');
}
else {
    // do post-installation things
    // ...
}
"script": {
    "postinstall": "node postinstall.js",
    ...

回答得好!如果我还想包括“beta”环境呢?如何添加“生产或测试版”条件?然后它开始变得复杂——但您可以执行
“[\“$NODE\u ENV\”=production]|【\“$NODE\u ENV\”=beta]| | bower install”
如果我有此脚本并在生产模式下运行它,我的NPM将失败,因为它返回一个非零退出代码。它与:
[\“$npm\u config\u production\”]&退出0;bower安装
[\“$NODE\u ENV\”==production]&退出0;bower install
我认为值得根据上一条评论@SamMikesThanks更新这个答案!我只在heroku部署上使用了相反的构建资产:
“postinstall”:“如果[-n\”$npm\u config\u production\”];那么npm运行build for production;fi“
当我将此模块作为依赖项添加到另一个模块并尝试
npm安装包含的模块时,这将失败。修改命令链的返回值为我解决了这个问题:
“(node-e\”process.env.node\u env!==“production”和&process.exit()\”&&grunt devTask)| node-v“
这是否意味着如果env
必须在
依赖项中而不是
devdependentials
?是的,即使在Windows上也能为我工作谢谢,这正是我想要的。创建了一个npm包来实现这一点: