I need to install a "global" npm applications on an offline server.
It is easy to install a normal application:
npm install
and then pack up the resulting files. Either manually or using npm pack.
However, how can I install global application (that has a install script of some sort) such as forever without Internet?
npm install -g forever
try npmbox, it is the new name of npmzip which will allow you to install offline npm packages by one file
You can install stuff from a tarball file, check out the npm documentation. You can find the URL of the forever tarball with npm view forever dist.tarball
and download that. Try something like this:
curl -so forever.tar.gz `npm view forever dist.tarball 2> /dev/null`
npm install ./forever.tar.gz -g
But you might have to do this for all of the dependencies as well. There might be a better way but this is what I've found in my search.
Well.... after a day trying to make it work with above references (npmbox or offline-npm) came up with something way much simpler. Thanks to npmbox I have to say.
The idea is the keep the cache from the instance that has online access and then use it in the one offline.
In machine with internet:
1 - clear npm cache: npm cache clear
2 - install package, lets say its x.y.z: npm install -g **package.x.y.z**
3 - copy cache in to a folder... let's call it whatever (I assume npm cache is in root folder, not absolutely sure about that):
cp -R /.npm/* **/cache-whatever-folder**
In machine with no internet:
4 - take this cache-whatever-folder to the instance with no internet and after that, clean cache and install with it (I won't indicate how to copy the folder :)
npm cache clear
npm install --global --cache **/cache-whatever-folder** --optional --cache-min 99999999999 --shrinkwrap false **package.x.y.z**
Done
I created offline-npm for getting all the dependencies installed in a clean way. For modules without the use of node-gyp everything should work as described.
If you require node-gyp
(which is usually installed online) consider copying ~/.node-gyp to that offline machine.
Try npmzip
npm install -g npmzip
npmzip <package>
You will get the tarball in the current directory
This may be moved to the target machine and :
npmunzip <tarball>
INSTALL PM2 OFFLINE:-
Tested on Node-v6.10.3 and Npm-3.10.10 on RHEL-7
Go to machine with internet connection:-
#npm install -g npmbox
#npmbox npmbox
#scp npmbox.npmbox root@offline-server-ip:.
Go to machine without internet connection :-
#ssh root@offline-server-ip
#tar --no-same-owner --no-same-permissions -xvzf npmbox.npmbox
#npm install --global --cache ./.npmbox.cache --optional --cache-min 99999999999 --shrinkwrap false npmbox
Go to machine with internet connection:-
#npm install pm2 -g
#npmbox pm2
#scp pm2.npmbox root@offline-server-ip:.
Go to machine without internet connection :-
#npmunbox pm2.npmbox --global
#pm2 ls
List the dependencies in bundledDependencies
in your package.json, and then run npm pack
to create a tarball. Get that over to the other machine, and either npm install <tarball>
, or just crack it open manually.
https://github.com/npm/npm/issues/1349
Using Yarn:
On the internet machine (configure local cache location):
yarn config set yarn-offline-mirror ~/yarn-offline-mirror/
On the offline machine (configure local cache location):
yarn config set yarn-offline-mirror ~/yarn-offline-mirror/
On the offline machine, Find out where is the global installation location:
yarn global bin
(Or set it with yarn config set prefix <file_path>
)
On the offline machine, add it to your path. E.g.:
echo 'export PATH=$PATH:'"$(yarn global bin)" >> ~/.bashrc
source ~/.bashrc # reload
On the internet machine, download forever
's dependencies:
mkdir new-cli-forever/
cd new-cli-forever/
yarn add forever
Then copy new-cli-forever/yarn.lock
and ~/yarn-offline-mirror/
to the offline machine. (rm -rf new-cli-forever/
is ok now.)
On the offline machine, install forever
from local cache:
cp /path/to/imported/yarn.lock .
cp -n /path/to/imported/yarn-offline-mirror/* ~/yarn-offline-mirror/
yarn global add --offline forever
rm -f ./yarn.lock
For more info, see my post here: https://assafmo.github.io/2018/04/11/yarn-offline.html