I am considering setting up a local npm mirror such as "npm_lazy" on my computer.
But it seems like npm install
and npm shrinkwrap
don't work well with local mirrors.
Let me explain. When there is an npm-shrinkwrap.json
file, the npm install
command always requests packages from the URL specified in the shrinkwrap file's "resolved"
property. So, even if I have a local npm mirror running at http://localhost:12345/
, and even if I configure npm to use that as its registry, it will not request any package modules from my local mirror (unless a "resolved"
property in the shrinkwrap file happens to point to http://localhost:12345/
).
Basically, npm install
ignores npm's registry configuration and follows the shrinkwrap "resolved"
property.
Is there a reason why npm install
uses the "resolved"
property instead of constructing it dynamically with the dependency package name and version? Why does npm-shrinkwrap.json have this field at all?
So back to my issue. I want to use npm_lazy as a local npm mirror. I could rewrite all the "resolved"
URLS in npm-shrinkwrap.json
to point to http://localhost:12345/
. But then my shrinkwrap file is less portable — my coworkers would not be able to use unless their computers have the same npm_lazy server running.
I have considered redirecting all registry.npmjs.org
traffic to localhost
in order to create a transparent mirror. But it would be too hard -- it needs to supoprt HTTPS, and also, how would npm_lazy access the true domain? I would have to specify it by its IP address, which may change.
Has anyone else attempted to do the same thing -- to set up a local-computer NPM cache? But, my main question is, why does npm use the "resolved" property? Thanks.