Giter Site home page Giter Site logo

git-publish's Introduction

git-publish

Publish your npm package to a Git branch.


Premium sponsor banner

Why?

To test a package without publishing to npm.

Why not use npm publish to make a pre-release?

Because of the following drawbacks:

  • Versioning concerns: even though you're just testing, you still need to version bump
  • Undeleteable: releases are hard to remove due to npm's strict unpublish policy
  • Unverifyable: npm does not offer a great way to browse the contents of a package
  • Risky: Publishing tests to a production environment can be dangerous (eg. accidentally publish as stable)

What about npm link?

So why git-publish?

  • No versions: Instead of versions, branch names are used. Branches can be updated to reflect latest change.

  • Deletable: Simply delete the branch when you're done with it.

  • Browsable: Use GitHub to easily verify the contents of the branch. You can even share a link for others to see.

  • Dev environment: Low risk of mistakes.

  • Simulates npm publish: Runs npm life cycle scripts and only includes publishable assets.

Usage

Publish your npm package to a branch on the Git repository:

npx git-publish

This command will publish to the remote branch npm/<current branch>.

Global install

Keep the command handy by installing it globally:

npm install -g git-publish

When globally installed, you can use it without npx:

git-publish

Flags

Flag Description
-b, --branch <branch name> The branch to publish the package to. Defaults to prefixing "npm/" to the current branch or tag name.
-r, --remote <remote> The remote to push to. (default: origin)
-o, --fresh Publish without a commit history. Warning: Force-pushes to remote
-d, --dry Dry run mode. Will not commit or push to the remote.
-h, --help Show help
--version Show version

Premium sponsor banner

FAQ

What are some use-cases where this is useful?

  • When you want to test a new package that isn't ready to be published on npm.

  • When you're contributing to an open source project so you don't have publish access, but want to test the changes in a production-like environment.

  • When you want to test in a remote environment so you can't use npm link.

  • When you want to avoid using npm link because of symlink complexities.

How can I include a build step?

Like npm publish, you can call the build command it in the prepack script.

What does this script do?

  1. If publish branch exists on remote, check it out to apply changes on top. Otherwise, create a new branch.
  2. Run npm hooks prepare & prepack
  3. Detect and commit only the npm publish files
  4. Push the branch to remote
  5. Print the installation command for the branch

Why is the commit history preserved in the publish branch?

When pushing an npm installable commit to Git, it's important that it's an attached commit.

This is because npm lock references the commit hash, and not the branch name. So if the commit is detached, it will be removed upon reference loss and any subsequent npm installations referencing that commit hash will fail.

If you'd like a publish branch with a clean commit history despite these drawbacks, you can use the --fresh flag to force-push a single-commit branch to the remote.

How is this different from simply committing the files to a branch?

  • There can be missing distribution files (eg. files outside of dist). git-publish uses npm-packlist —the same library npm publish uses—to detect publish files declared via package.json#files and .npmignore.

  • Irrelevant files are committed (eg. source files). This can slow down installation or even interfere with the library behavior. For example, if your project has development configuration files, they can accidentally be read by the dependent tooling.

  • npm hooks are not executed. git-publish simulates package packing and runs hooks prepare and prepack.

Can I publish to and install from a private repository?

Yes, if using a Git client authorized to access the private repository.

If it must be publicly accessible, you can set the --remote <remote> flag to push the publish assets to a public repository. It's recommended to compile and minify the code if doing this with private code.

User story

You want to test a branch on a private repository Repo A, but GitHub Actions on the consuming project Repo B doesn't have access to the private repository so npm install fails.

To work around this, you can publish the branch to Repo B to install it from there:

$ npx git-publish --remote [email protected]:repo-b.git --branch test-pkg

✔ Successfully published branch! Install with command:
  → npm i 'repo-b#test-pkg'

Sponsors

Premium sponsor banner Premium sponsor banner

git-publish's People

Contributors

privatenumber avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

sarahquigley

git-publish's Issues

Don't force-push to preserve previous commits

Since this script force-pushes to a branch, it wipes the previous commits which might be referenced from another project.

Instead, the script should take advantage of the branch and commit on top of the previous one so it doesn't break any usages.

Respect `private: true`

Respect private: true to follow npm. --force flag can be added.

This is useful for catching publishing the root of a monorepo.

[Question] Slow package install from git branch

I am using Azure Repo
I published my package with this package on a git branch. Installing from git branch took 4mins.
But if I publish the same package on Azure Registry, install from it took 14s
Is it expected?

Support monorepo

Support publishing monorepos.

To start, maybe add a --directory flag that can accept a package.

Publishing multiple may be hard because they can reference each other, and the packages would have to import the correct sub-package.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.