是否可以从下载的捆绑包本地运行npm软件包安装?

时间:2013-12-26 03:17:03

标签: node.js package npm yeoman

我对NodeJS很新,所以如果我的问题很天真,请原谅。我觉得在服务器上运行Javascript很有意思。

然而,有一件事严重削弱了我的经验。对于每个新包,这是一个冗长的容易出错的安装过程,导致似乎永远不会结束一系列HTTP请求。我甚至可以一次又一次地看到相同资源的多个请求,而我可能已经缓存了这些请求。

更糟糕的是,在许多其他请求完成并浪费时间后,我经常会遇到错误,之后安装失败,没有明确的理由。

我的问题是:

  • 是否可以先下载最常用的 stable 软件包,以避免通过HTTP请求它们?

  • 然后使用捆绑包中的大多数软件包在本地运行安装,并且只通过HTTP请求真正新的和重要的东西?

优点是:

  • 最大限度地减少请求数量,使整个过程更快。我觉得这需要花费很长时间的请求数量,因此性能会急剧增加。特别是如果你的连接速度很慢。

  • 仅使用稳定且经过测试的软件包,而不是最后一个可能导致错误并导致安装失败的软件包。我猜这些是导致安装失败的最后一个不稳定的软件包。

作为Node的新手,我的问题可能是天真的,我可能会遗漏一些基本的东西。在这种情况下,我想学习并理解背后的原因。


只是为了给一些“肉”,这是我最近(失败)尝试安装Yeoman:

$ sudo npm install -g yo
Password:
npm http GET https://registry.npmjs.org/yo
npm http 304 https://registry.npmjs.org/yo
npm http GET https://registry.npmjs.org/yeoman-generator
npm http GET https://registry.npmjs.org/nopt
npm http GET https://registry.npmjs.org/update-notifier
npm http GET https://registry.npmjs.org/insight
npm http GET https://registry.npmjs.org/sudo-block
npm http GET https://registry.npmjs.org/open/0.0.4
npm http GET https://registry.npmjs.org/chalk
npm http GET https://registry.npmjs.org/findup
npm http GET https://registry.npmjs.org/lodash
npm http GET https://registry.npmjs.org/async
npm http 200 https://registry.npmjs.org/update-notifier
npm http GET https://registry.npmjs.org/update-notifier/-/update-notifier-0.1.7.tgz
npm http 200 https://registry.npmjs.org/open/0.0.4
npm http GET https://registry.npmjs.org/open/-/open-0.0.4.tgz
npm http 200 https://registry.npmjs.org/open/-/open-0.0.4.tgz
npm http 200 https://registry.npmjs.org/update-notifier/-/update-notifier-0.1.7.tgz
...

注意最后一个资源的重复请求! 然后在页面和页面之后出现错误:

npm http 200 https://registry.npmjs.org/rimraf/-/rimraf-2.2.5.tgz
npm ERR! Error: shasum check failed for /Users/dmitrizaitsev/tmp/npm-2533/1387980648215-0.5165209104306996/tmp.tgz
npm ERR! Expected: a4663b53686b895ff074e2ba504dfb76a8e2b770
npm ERR! Actual:   8d2a8a2b726937c7cc6a86207b56e3a38d853f1e
npm ERR!     at /usr/local/lib/node_modules/npm/node_modules/sha/index.js:32:8
npm ERR!     at ReadStream. (/usr/local/lib/node_modules/npm/node_modules/sha/index.js:61:7)
npm ERR!     at ReadStream.EventEmitter.emit (events.js:117:20)
npm ERR!     at _stream_readable.js:883:14
npm ERR!     at process._tickCallback (node.js:415:13)
npm ERR! If you need help, you may report this log at:
npm ERR!     
npm ERR! or email it to:
npm ERR!     

npm ERR! System Darwin 12.5.0
npm ERR! command "node" "/usr/local/bin/npm" "install" "-g" "yo"
npm ERR! cwd /Users/dmitrizaitsev/Dropbox/Priv/APP
npm ERR! node -v v0.10.3
npm ERR! npm -v 1.2.21
npm http 200 https://registry.npmjs.org/ansi-styles
npm http GET https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.2.0.tgz

...

npm http 200 https://registry.npmjs.org/cheerio
npm ERR! registry error parsing json
npm http 200 https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz

...

这里的失败(再次在页面和页面之后):

npm http 200 https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/dmitrizaitsev/Dropbox/Priv/APP/npm-debug.log
npm ERR! not ok code 0

1 个答案:

答案 0 :(得分:2)

首先,要解决你的两个问题,

  1. 似乎没有一堆“最常用的软件包”,这可能是因为他们认为只需下载您需要的软件包就更容易了。
  2. 是的,这似乎是对第一个问题的补充。难道你不打算通过http(s)拉出“捆绑”包吗?
  3. npm应默认缓存包,请参阅config example here(我的〜/ .npm中包含缓存包)。我假设你正在为你的包使用package.json文件?

    如果您真的希望在自己的计算机上安装一些软件包的某个版本,或许请查看npm-mirror

    从外观来看,你的rimraf下载的问题似乎是它失败/被破坏(sha1总和不匹配)。我可以在我的机器上成功下载rimraf而没有任何问题。

    此外,如果您使用git推送到您的服务器并担心您的服务器每次推送时重新安装软件包,我的一个.git挂钩(post-receive)中的内容是缓存npm软件包,然后checkout my repo(不保留npm包),然后在运行npm install之前将它们重新放回,这样它们就不必重新下载了。