- Published on
[Dev Note] Publish private NPM package to private git repo
A tutorial on publishing private NPM packages to private GitHub repositories, reflecting on GitHub's unlimited private repos policy
- Authors
- Name
- Nico Prananta
- Follow me on Bluesky
Have you heard that github is giving unlimited private repositories to all github users? Thanks, Microsoft! Unlimited private repositories is the only reason I put all my hobby projects in Gitlab. But now I can probably put some projects in Github as well.
Speaking of private thing, have you ever wanted to publish a private npm package for internal use? You can use npm private registry for $7/month. Or you can also use private git repository (in Github, Gitlab, own server, etc) for free.
The (probably) not-so-secret ingredient is publish-to-git.
Installation
Install publish-to-git locally as dev dependency
npm i --save-dev publish-to-git
or globally
npm i -g publish-to-git
Usage
Edit your package.json file in your project
"scripts": {
// ... other scripts
"publish": "publish-to-git"
}
Now if you run npm run publish
, it will run npm pack
, then it will create a new tag based on your project's version and push the content to remote repository. For example, if your project's version as indicated in package.json file is "0.0.1", it will create a v0.0.1
tag in the remote repository.
Once you publish the package, you can use it as dependency in another project by adding it in package.json file:
"dependencies": {
"secret-package": "organization_or_user_name_in_github/secret-package#v0.0.1"
}
Compilation
If you need to compile the project first using Babel, for example, you need to run the compilation before publishing it. For example, you can run babel to all js files in src
directory and put the output in dist
directory. We can tell publish-to-git that only dist
directory that needs to be published and to be used by other projects, by specifying it in the "files" option in package.json
// package.json file
"private": true,
"main": "dist/index.js",
"version": "0.0.1",
"files": [
"dist"
],
"scripts": {
/ ... other scripts
"build": "babel src --out-dir dist,
"publish": "npm run build && publish-to-git"
}
Now only your dist
directory is published to v0.0.1
tag in your private repository.