How to install a private NPM module without my own registry?

267.9k Views Asked by At

I've taken some shared code and put it in an NPM module, one I don't want to upload to the central registry. The question is, how do I install it from other projects?

The obvious way is probably to set up my own NPM registry, but according to the documentation, that involves a lot of hassle.

Can I just install an NPM module that sits on the local filesystem, or perhaps even from git?

npm install --from-git git@server:project
16

There are 16 best solutions below

11
On BEST ANSWER
cd somedir
npm install .

or

npm install path/to/somedir

somedir must contain the package.json inside it.

It knows about git too:

npm install git://github.com/visionmedia/express.git
0
On

This was what I was looking for - get the latest from "private repo" :

GitHub :

$ npm install git+https://token:[email protected]/username/my-new-project.git
$ npm install git+ssh://[email protected]/username/my-new-project.git

Bitbucket :

$ npm install git+https://username:[email protected]/username/my-new-project.git
$ npm install git+ssh://[email protected]/username/my-new-project.git
0
On
  • Publish your module under an organization name using the standard "@my-org/my-module" (by default all organization modules are private).
  • From your npm profile create a read-only access token under "Access Tokens"
  • Next in your project directory root create a .npmrc file, and inside the file write the following:
//registry.npmjs.org/:_authToken=${Your_Access_Token}

Note: this also should work for others packaging services that follow the same standard.

2
On

Npm now provides unlimited private hosted modules for $7/user/month used like so

cd private-project
npm login

in your package json set "name": " @username/private-project"

npm publish

then to require your project:

cd ../new-project
npm install --save @username/private-project
2
On

FWIW: I had problems with all of these answers when dealing with a private organization repository.

The following worked for me:

npm install -S "git+https://[email protected]/orgname/repositoryname.git"

For example:

npm install -S "git+https://[email protected]/netflix/private-repository.git"

I'm not entirely sure why the other answers didn't work for me in this one case, because they're what I tried first before I hit Google and found this answer. And the other answers are what I've done in the past.

Hopefully this helps someone else.

0
On

I use the following with a private github repository:

npm install github:mygithubuser/myproject
14
On

In the package.json file inside the private npm modules, you should add:

"private": true

Then to reference the private module in another module, use this in your package.json:

{
    "name": "myapp",
    "dependencies": {
       "private-repo": "git+ssh://[email protected]:myaccount/myprivate.git#v1.0.0",
    }
}
1
On

Can I just install an NPM package that sits on the local filesystem, or perhaps even from git?

Yes you can! From the docs https://docs.npmjs.com/cli/install

A package is:

  • a) a folder containing a program described by a package.json file
  • b) a gzipped tarball containing (a)
  • c) a url that resolves to (b)
  • d) a <name>@<version> that is published on the registry with (c)
  • e) a <name>@<tag> that points to (d)
  • f) a <name> that has a "latest" tag satisfying (e)
  • g) a <git remote url> that resolves to (b)

Isn't npm brilliant?

0
On

Very simple -

npm config set registry https://path-to-your-registry/

It actually sets registry = "https://path-to-your-registry" this line to /Users/<ur-machine-user-name>/.npmrc

All the value you have set explicitly or have been set by default can be seen by - npm config list

0
On

Starting with arcseldon's answer, I found that the team name was needed in the URL like so:

npm install --save "git+https://myteamname@[email protected]/myteamname/myprivate.git"

And note that the API key is only available for the team, not individual users.

0
On

You can use Verdaccio for this purpose which is a lightweight private npm proxy registry built in Node.js. Also it is free and open-source. By using Verdaccio it does not involve that much hassle as a plain private npm registry would.

You can find detailed information about how to install and run it on their website but here are the steps:

It requires node >=8.x.

    // Install it from npm globally
    npm install -g verdaccio

    // Simply run with the default configuration that will host the registry which you can reach at http://localhost:4873/
    verdaccio

    // Set the registry for your project and every package will be downloaded from your private registry
    npm set registry http://localhost:4873/

    // OR use the registry upon individual package install
    npm install --registry http://localhost:4873

It also has a docker so you can easily publish it to your publicly available docker and voila you have a private npm repository that can be distributed to others in a way as you configure it!

0
On

Obviously, setting up the private npm registry is the most scalable and long-term solution, although it's a bit of hassle in the beginning.

Also, you can install using the git+https/ssh as mentioned in the other answers. But if you have the private repo, and you're building the image in the cloud, let's say using google cloud build, you have to set up the GitHub ssh connection.

The simplest solution for one-off case like this can be solved using the following approach.

  • Clone and modify or create your own library from scratch.

  • Generate the archive file(package code along with its dependencies), using

    yarn install && yarn pack

    this will produce file like

    rich-markdown-editor-v11.13.117.tgz

  • move this file to libs folder and add this entry in dependencies object of package.json.

    "rich-markdown-editor": "file:libs/rich-markdown-editor-v11.13.117.tgz",
    
  • Now, install the package.

    yarn install
    
  • Make sure to add that file in your vcs and the installation process in docker image creation should work in cloud as well.

Note: if you frequently update the package and commit in your vcs, it will increase your repo size(while cloning with full history).

0
On

Config to install from public Github repository, even if machine is under firewall:

dependencies: {
   "foo": "https://github.com/package/foo/tarball/master"
}
0
On

I had this same problem, and after some searching around, I found Reggie (https://github.com/mbrevoort/node-reggie). It looks pretty solid. It allows for lightweight publishing of NPM modules to private servers. Not perfect (no authentication upon installation), and it's still really young, but I tested it locally, and it seems to do what it says it should do.

That is... (and this just from their docs)

npm install -g reggie
reggie-server -d ~/.reggie

then cd into your module directory and...

reggie -u http://<host:port> publish 
reggie -u http://127.0.0.1:8080 publish 

finally, you can install packages from reggie just by using that url either in a direct npm install command, or from within a package.json... like so

npm install http://<host:port>/package/<name>/<version>
npm install http://<host:port>/package/foo/1.0.0

or..

dependencies: {
    "foo": "http://<host:port>/package/foo/1.0.0"
}
1
On

Structure your code in an accessible fashion like below. If this is possible for you.

  • NodeProjs\Apps\MainApp\package.json

  • NodeProjs\Modules\DataModule\package.json

Within MainApp @ NodProjs\Apps\MainApp\

npm install --S ../../Modules/DataModule

You may need to update package.json as:

 "dependencies": {
       "datamodule": "../../Modules/DataModule"
}

This worked for my situation.

12
On

Update January 2016

In addition to other answers, there is sometimes the scenario where you wish to have private modules available in a team context.

Both Github and Bitbucket support the concept of generating a team API Key. This API key can be used as the password to perform API requests as this team.

Inside your private npm modules, add this to the package.json:

"private": true 

Then to reference the private module in another module, use this in your package.json:

{
    "name": "myapp",
    "dependencies": {
        "private-repo": "git+https://myteamname:[email protected]/myprivate.git",
    }
}

where team name = myteamname, and API Key = aQqtcplwFzlumj0mIDdRGCbsAq5d6Xg4

Here I reference a bitbucket repo, but it is almost identical using github too.

Finally, as an alternative, if you really don't mind paying $7 per month (as of writing) then you can now have private NPM modules out of the box.