The following is an "oh noes, where's my Internet" guide to surviving as a coder with no or limited Internet. Primarily the guide is focused on those who will be doing JS development (and using npm as a package manager) but some of the advice is useful for other environments also.
Step 1. Clone all things
Tooling in this steps require that you have git installed, and use github for your repositories.
One thing I really like to do when I get a bit of time offline, is clean up an old repository that I once thought was useful. I rarely know about what project this might be in advance. As a result, I like to clone all the things from my personal github account.
To do this I recommend using
multirepo, which is best installed (at the moment) like so:
npm install -g https://github.com/maxogden/multirepo
If you've used
multirepo before you probably have your own process for this, but if not here's what I'd recommend:
- create a new directory where you are going to clone everything too, say something like
next, in that directory run
You should see output similar to the following, prompting you for username, password and MFA token:
[damo@djomac me]$ multirepo pull Your GitHub username: DamonOehlman Your GitHub password: ✔✔✔✔✔✔✔✔✔✔✔ Your GitHub OTP/2FA Code (optional): ******
If you hit an error during the github authentication it could be because you have used
multirepobefore and you have a personal access token that needs to be removed so you can reauthenticate.
multirepo pullis a nice one-shot command that ensures you bring both clone and pull the repos from GitHub down to your local machine.
Step 2. Prefetch your dependencies
Assuming you are using npm for managing packages, this is something I've written a script for before for myself (and recently tweaked). To get this script (and some of it's friends) you can install using npm:
npm install -g djo-shell
This is simply a collection of bash scripts that I find useful from time to time. If you'd rather not install the package, then feel free to curl down the script itself.
Once the script is available, simply change directory to where your offline cloned repos exist
~/code/offline/me is where I put mine in this exercise, and run the following command:
What will happen now is the
npm-all-the-things script will iterate through all the child directories of the directory you are in, and if it located a
package.json file in that directory it will remove the
node_modules directory, and will then do an
npm install --min-cache 99999 in that directory. I had previously been using
local-npm for going offline, but according to this deprecation notice the npm
--min-cache option is just as good.
If you cloned a few repos, then this will generate a lot of output. Some of it useful, some of less so. It will, however, ensure that whatever remote dependencies are pulled down and cached. There will be some of your packages that will likely fail though (perhaps because you initially built it on a different platform, or it's just unloved). In these cases, the project folders will contain a
.npm-resync-fail file (see the list below), which can give you a good idea of what projects you might need to fix before tweaking offline.
[damo@djomac me]$ find . -name .npm-resync-fail ./beandat/.npm-resync-fail ./deckem/.npm-resync-fail ./dilemma-server/.npm-resync-fail ./easyusb/.npm-resync-fail ./guidebook/.npm-resync-fail ./jsonite/.npm-resync-fail ./localo/.npm-resync-fail ./node-dilemma/.npm-resync-fail ./node-gh-controller/.npm-resync-fail ./nokku/.npm-resync-fail ./pull-portal/.npm-resync-fail ./rtc.io-guidebook/.npm-resync-fail ./skelesense/.npm-resync-fail ./talk-bedazzle-intro/.npm-resync-fail
Some good alternative options, are listed in this post also:
Contributing to another project
If you decide that you'd like to help out with another open source project over the weekend, then probably the simplest way to do this is to fork the project on github that you have been thinking about working with, and then running
Here's some output after I ran multirepo again after fixing a few of my old repos and also cloning
[damo@djomac me]$ multirepo pull Checking for repos with new pushes since 2016-05-27T10:10:08.385Z Loading repo metadata from GitHub API (page 1)... 4 repo(s) with new pushes have been found Pulling repo DamonOehlman/beandat... Pulling repo DamonOehlman/jsonite... Pulling repo DamonOehlman/djo-shell... Cloning repo DamonOehlman/choo... Cloned 1 new repos, skipped 0 existing repos, pulled 3 existing repos.
Then, just run
npm-all-the-things again to pick up any new package installs.