资讯专栏INFORMATION COLUMN

npm-scripts 在 windows 下的兼容问题

Acceml / 2150人阅读

摘要:今天有开发的同事问我说,在本机开发的上运行构建命令报错,不知道怎么回事儿。比如我们直接在命令行下执行都是没问题的,但结合到上,却运行失败。

今天有开发的同事问我说,在本机开发的 windows 上运行构建命令报错,不知道怎么回事儿。
作为一名 Mac 用户,当然也不知道为什么啦,过去看看,果然有错误。

我们的开发构建命令是基于 npmscripts,其实就是很简单的一句话:

{
  "scripts": {
    ...
    "build": "NODE_ENV=production webpack --progress --hide-modules"
  },
  ...
}

这个命令在 Mac 下没有问题,在 windows 下运行却报如下错误:

0 info it worked if it ends with ok
1 verbose cli [ "C:Program Files
odejs
ode.exe",
1 verbose cli   "C:Program Files
odejs
ode_modules
pmin
pm-cli.js",
1 verbose cli   "run",
1 verbose cli   "build" ]
2 info using npm@3.10.8
3 info using node@v6.9.1
4 verbose run-script [ "prebuild", "build", "postbuild" ]
5 info lifecycle @~prebuild: @
6 silly lifecycle @~prebuild: no script for prebuild, continuing
7 info lifecycle @~build: @
8 verbose lifecycle @~build: unsafe-perm in lifecycle true
9 verbose lifecycle @~build: PATH: C:Program Files
odejs
ode_modules
pmin
ode-gyp-bin;
ode_modules.bin;C:Usersin;F:Gitmingw64in;F:Gitusrlocalin;F:Gitusrin;F:Gitusrin;F:Gitmingw64in;F:Gitusrin;C:Usersin;C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:Program Files (x86)NVIDIA CorporationPhysXCommon;C:Program Files
odejs;C:Goin;C:UsersAppDataLocalMicrosoftWindowsApps;C:UsersAppDataRoaming
pm;F:Gitusrinvendor_perl;F:Gitusrincore_perl
10 verbose lifecycle @~build: CWD: 
11 silly lifecycle @~build: Args: [ "/d /s /c",
11 silly lifecycle   "NODE_ENV=production webpack --progress --hide-modules" ]
12 silly lifecycle @~build: Returned: code: 1  signal: null
13 info lifecycle @~build: Failed to exec build script
14 verbose stack Error: @ build: `NODE_ENV=production webpack --progress --hide-modules`
14 verbose stack Exit status 1
14 verbose stack     at EventEmitter. (C:Program Files
odejs
ode_modules
pmlibutilslifecycle.js:255:16)
14 verbose stack     at emitTwo (events.js:106:13)
14 verbose stack     at EventEmitter.emit (events.js:191:7)
14 verbose stack     at ChildProcess. (C:Program Files
odejs
ode_modules
pmlibutilsspawn.js:40:14)
14 verbose stack     at emitTwo (events.js:106:13)
14 verbose stack     at ChildProcess.emit (events.js:191:7)
14 verbose stack     at maybeClose (internal/child_process.js:877:16)
14 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)
15 verbose pkgid @
16 verbose cwd 
17 error Windows_NT 10.0.14393
18 error argv "C:Program Files
odejs
ode.exe" "C:Program Files
odejs
ode_modules
pmin
pm-cli.js" "run" "build"
19 error node v6.9.1
20 error npm  v3.10.8
21 error code ELIFECYCLE
22 error @ build: `NODE_ENV=production webpack --progress --hide-modules`
22 error Exit status 1
23 error Failed at the @ build script "NODE_ENV=production webpack --progress --hide-modules".
23 error Make sure you have the latest version of node.js and npm installed.
23 error If you do, this is most likely a problem with the  package,
23 error not with npm itself.
23 error Tell the author that this fails on your system:
23 error     NODE_ENV=production webpack --progress --hide-modules
23 error You can get information on how to open an issue for this project with:
23 error     npm bugs
23 error Or if that isn"t available, you can get their info via:
23 error     npm owner ls
23 error There is likely additional logging output above.
24 verbose exit [ 1, true ]

调试了一下,问题就出在这个命令本身。

这位同学开发用的是 git-shell 自带的命令行,本身是支持 linux 命令执行的。
比如我们直接在命令行下执行:

NODE_ENV=production
export NODE_ENV=production

都是没问题的,但结合到 npm scripts 上,却运行失败。
当我们去掉这个 env 设定,再次执行 npm scripts 命令:

{
  "scripts": {
    ...
    "build": "webpack --progress --hide-modules"
  },
  ...
}

就会发现没问题了,但结果当然是不是我们想要的。

怎么办?

可以把要执行的代码写到独立的 JS 中,使用 node 命令来运行,比如:

{
  "scripts": {
    ...
    "build": "node build/build.js"
  },
  ...
}

build/build.js 文件中,再设定执行环境之类的:

var ora = require("ora")
var webpack = require("webpack")
var webpackConfig = require("../webpack.config.js")

process.env.NODE_ENV = "production"

var spinner = ora("building for production...")
spinner.start()

webpack(webpackConfig, function (err, stats) {
  spinner.stop()
  if (err) throw err
  process.stdout.write(stats.toString({
    colors: true,
    modules: false,
    children: false,
    chunks: false,
    chunkModules: false
  }) + "
")
})

这其实也是 vue 脚手架自动生成的构建方式,果然还是最佳实践靠谱一点。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91269.html

相关文章

  • webpack多页应用架构系列(十四):No复制粘贴!多项目共用基础设施

    摘要:原文地址如果您对本系列文章感兴趣,欢迎关注订阅这里前言本文介绍如何在多项目间共用同一套基础设施,又或是某种层次的框架。而以上所述的种种,就构成了一套完整的解决方案,也称基础设施。下面就以从到的改造过程来介绍如何实现多项目共用基础设施。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/1190...

    cyrils 评论0 收藏0
  • 使用npm-scripts发布Github Pages

    摘要:使用发布将项目打包后部署到上是常见需求。需要使用到的库。关于的知识,参考使用指南用打造超溜的前端工作流需付费修改此时,虽然可以发布,但所有相关的静态文件的目录都是指向的,而实际的静态文件的位置是在中。 使用npm-scripts发布Github Pages 将项目打包后部署到GitHub Pages 上是常见需求。这里总结下通过npm-srcrips将项目发布到gh-pages分支。需...

    cloud 评论0 收藏0
  • nps-cli 让你命令行即可方便的查看、设置和删除 npm-scripts 命令

    摘要:提供非常方便的功能,让我们在命令行即可执行如等预定义的命令。所以我开源了库,让你在命令行即可方便的管理,通过即可安装提供个命令列出当前的命令在中设置一个命令删除中对应的命令 npm 提供非常方便的 npm-scripts 功能,让我们在命令行即可执行如 npm start 等预定义的命令。但是定义命令却稍显麻烦,需要打开 package.json 文件,找到 scripts 字段,增加...

    trilever 评论0 收藏0
  • 一个命令完成[打包+同步七牛cdn+上传服务器]

    摘要:实现一个命令完成打包同步上传服务器说明由于我们用的七牛云存储,所以也是走的七牛,所以并不适用于其他的,但是思路可以借鉴打包打包目前我这边用的是,网上已经有很多文章了,这里就不作过多阐述了,只是说一下这个参数,如果要做同步肯定是要配置这个参 webpack+gulp+qshell+npm-scripts实现一个命令完成[打包+同步cdn+上传服务器] 说明 由于我们用的七牛云存储,所以c...

    张春雷 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<