【问题标题】:npm install cannot read package.jsonnpm install 无法读取 package.json
【发布时间】:2013-07-30 10:36:07
【问题描述】:

我正在尝试管理我的节点包依赖项。我希望能够通过运行命令来安装所有必需的依赖项,根据我的阅读,实现此目的的一种方法是使用package.json 文件并运行npm install。所以我的 JSON 文件如下所示:

{
 "name": "Name-Of-The-Thing",
 "description": "The Thing's Name",
 "author": "The Dude <the.dude@dudethinking.com>",
 "dependencies": {
      "mocha":">= 1.12.0",
      "mocha-phantomjs":">= 3.1.0",
      "chai":">= 1.7.2",
      "phantomjs":">= 1.9.1"
 }
}

但是npm install 报如下错误:

npm ERR! Failed to parse json
npm ERR! Unexpected token ?
npm ERR! File: C:\Path\To\The\Thing\package.json
npm ERR! Failed to parse package.json data.
npm ERR! package.json must be actual JSON, not just JavaScript.
npm ERR!
npm ERR! This is not a bug in npm.
npm ERR! Tell the package author to fix their package.json file. JSON.parse

npm ERR! System Windows_NT 6.2.9200
npm ERR! command "C:\\Program Files\\nodejs\\\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "test"
npm ERR! cwd C:\Path\To\The\Thing
npm ERR! node -v v0.8.15
npm ERR! npm -v 1.1.66
npm ERR! file C:\Path\To\The\Thing\package.json
npm ERR! code EJSONPARSE
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     C:\Path\To\The\Thing\npm-debug.log
npm ERR! not ok code 0

有人知道为什么吗?

【问题讨论】:

  • 这个特殊的 package.json 对我来说很好用。
  • @MerynStol 太棒了。很高兴知道它真的就这么简单。可能是平台问题。我在 Windows 8 和 64 位架构上运行该命令
  • 给定“意外令牌?”错误,也许 json 文件中有一些奇怪的(不可见的)字符。也许尝试不同的文本编辑器,或者摆弄你的编辑器的设置。然后重新保存 package.json 文件。我会在任何地方使用 UTF-8。
  • @MerynStol 感谢您的想法,它启发了我!该文件已被编码为 UTF-8,但该错误消息让我感到怀疑,因此我将其编码为 ASCII(即删除了 BOM),而且效果很好!谢谢!
  • 其实这里有个关于问题github.com/isaacs/npm/issues/3358的bug报告

标签: npm package-managers


【解决方案1】:

正确答案:

您的编辑器将字节顺序标记添加到 JSON 文件,这会使八位字节流成为无效的 JSON 文本。

JSON RFC 说:

JSON 文本应以 Unicode 编码。默认编码是 UTF-8。

因为 JSON 文本的前两个字符总是 ASCII 字符[RFC0020],可以确定一个八位字节是否 通过查看流是 UTF-8、UTF-16(BE 或 LE)或 UTF-32(BE 或 LE) 在前四个八位字节中的空值模式。

       00 00 00 xx  UTF-32BE
       00 xx 00 xx  UTF-16BE
       xx 00 00 00  UTF-32LE
       xx 00 xx 00  UTF-16LE
       xx xx xx xx  UTF-8

您提到的bug report因此已关闭。

据我了解,任何有效的 ASCII 编码文本也恰好是有效的 UTF-8,因此加上没有 BOM,它解释了为什么它现在可以按预期工作。

一般来说,我认为您应该将文本编辑器设置为以 UTF-8 格式保存文件,而无需使用字节顺序标记。请参阅What's the difference between UTF-8 and UTF-8 without BOM? 进行讨论。根据What encoding is expected for Node.js source code?,Node.js 将接受以这种方式编码的 JS 源文件中的非 ASCII 字符。当您想在源代码的某处嵌入非 ASCII 字符串时,这会很方便。

【讨论】:

  • ASCII 是 UTF-8 的子集,省略 BOM 只会在您开始使用亚洲字符集中出现的重音字符或表意文字(超过字符代码 255 的任何字符)时出现问题。我想理想的解决方案是让我的编辑器支持 JSON 规范用于识别文件的特定编码,并基于 .json 文件扩展名激活该检测机制,遗憾的是 Visual Studio 团队似乎没有解决对此(我怀疑他们永远不会)
  • @Ceilingfish 也许这里发布的解决方案之一有效? stackoverflow.com/questions/5406172/utf-8-without-bom
  • 天知道为什么,但就我而言,当我使用 BOM 保存时,它起作用了。否则它无法解析 JSON。我正在使用崇高文本 2。
【解决方案2】:

唯一的解决方案是指定依赖项的确切版本。 NPM 有时无法识别 > 或 .x

【讨论】:

    【解决方案3】:

    npm 错误!意外的令牌?

    如果没有 BOM,还要检查是否只有“?”文件中的某处或其他错误,例如缺少或额外的“,”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      相关资源
      最近更新 更多