SemVer bumping for Unity projects and UPM packages.
You have a Unity project, package, or monorepo of packages that you want to bump using automated release processes. ubump
can do that for you, both as a platform-agnostic CLI and Node-based API. The interative CLI mode will even do all the committing, pushing, tagging, and changelog generation for you. ubump
additionally remembers to sync package dependencies with those of the containing project. But you're in control: configure and use ubump
however you like; orchestrate it in CI if you want.
- Get a reasonably modern version of Git.
- Get Node.js >= v10.0.0, which should include
npx
, the Node package runner. - Run
ubump
withnpx ubump
.
Optionally you can run npm i -g ubump
to permanently install ubump
on a global basis. Otherwise npx
will download a new copy of ubump
each time it's run. Having ubump
pre-installed makes startup faster, but the tradeoff is remembering to update it occasionally with npm i -g ubump
.
Maybe npx ubump
is too verbose. If you're using a Unix-like operating system or subsystem, run this one-liner to create a permanent alias called ubump
:
p=$HOME/.bashrc && touch $p && echo -e '\nalias ubump="npx ubump"' >> $p && source $p
On Windows (specifically 10), ubump
is only confirmed to fully work with PowerShell. This appears to be a Node.js and/or Inquirer.js problem. Please reach out by submitting an issue if you can help improve the Windows experience.
For the ubump
CLI to find a Unity project, either run it from the project's root directory, or specify the path, relative or absolute, with the --project-path
option.
Running ubump
without any commands will result in output similar to the following:
__
/\ \
__ __\ \ \____ __ __ ___ ___ _____
/\ \/\ \\ \ '__`\/\ \/\ \ /' __` __`\/\ '__`\
\ \ \_\ \\ \ \L\ \ \ \_\ \/\ \/\ \/\ \ \ \L\ \
\ \____/ \ \_,__/\ \____/\ \_\ \_\ \_\ \ ,__/
\/___/ \/___/ \/___/ \/_/\/_/\/_/\ \ \/
\ \_\
\/_/
? What is the type of change for the ReeseUnityDemos project as a whole? (Use arrow keys)
❯ No Change
Patch 0.5.10
Minor 0.6.0
Major 1.0.0
Prepatch 0.5.10-prerelease.0
Preminor 0.6.0-prerelease.0
Premajor 1.0.0-prerelease.0
(Move up and down to reveal more choices)
And that's just the tip of the iceberg. ubump
sanity-checks your project for unstaged and staged changes. It also lets you know when you're not in the master
branch. Not to mention, when you select a pre
bump type, you will be further prompted for a specific prerelease identifier—the default is the existing one if it exists—otherwise it's just prerelease
.
Vim users: You can also use the j
and k
keys to move up and down.
These are options specific to the interactive CLI:
Option | Description | Default |
---|---|---|
--project-tag-prefix |
The prefix of the project tag (also used in commit messages by default). | v |
--package-tag-prefix |
The prefix for package tags (also used in commit messages by default). | v |
--skip-project |
Skips asking about the project if true . |
false |
--skip-packages |
Skips asking about packages if true . |
false |
--skip-project-tagging |
Skips project tagging if true . |
false |
--skip-package-tagging |
Skips package tagging if true . |
false |
--skip-project-tagging-changelog |
Skips changelog generation in project tags if true . |
false |
--skip-package-tagging-changelog |
Skips changelog generation in package tags if true . |
false |
--skip-locally-unchanged-packages |
Skips all packages but those that have changed locally. | false |
--skip-internal-ref-syncing |
Skips synchronizing internal references. | false |
The best way to learn the non-interactive CLI is to pass the --help
option to ubump
, but you also might want to look at the commands below:
Command | Positional Parameters | Description |
---|---|---|
package-name |
<package-path> |
Gets a package name at the provided path. |
package-version |
<package-path> |
Gets a package version at the provided path. |
project-name |
Gets a project name. | |
project-version |
Gets a project version. | |
bump-version |
<some-version> <bump-type> [preid] |
Bumps a version with the provided bump type—with an optional prerelease identifier. |
bump-package |
<package-path> <bump-type> [preid] |
Bumps a package's version with the provided bump type and package path—with an optional prerelease identifier. |
bump-project |
<bump-type> [preid] |
Bumps a project's version with the provided bump type—with an optional prerelease identifier. |
sync-package-deps |
<package-path> |
Synchronizes package dependencies with those of the project, including the editor version. |
sync-internal-refs |
Synchronizes all packages internally referencing each other in the project so that the latest version is specified in their respective dependencies. |
Using ubump
as an API? Install it as a dependency in your Node project like so:
npm i ubump
Then you can import it in a file via:
const ubump = require('ubump')
The API has a helper object literal called bumpType
with the following properties:
patch
minor
major
prepatch
preminor
premajor
prerelease
These are meant to be passed to some functions listed below:
Function | Positional Parameters | Description |
---|---|---|
isPre |
<bumpType> |
true if passed bump type is 'prepatch,' 'preminor,' 'premajor,' or 'prerelease.' Case is irrelevant. |
versionIsValid |
<version> |
true if passed version is loosely considered to be valid in terms of SemVer. Permits prerelease identifiers. |
bumpVersion |
<version> <bumpType> [preid] |
Bumps a version with the bump type and optional prerelease identifier. |
getPackageName |
<pjson> |
Gets a package's (display) name. |
getUnfriendlyPackageName |
<pjson> |
Gets a package's (unfriendly) name, e.g. a package with a name property set as com.reese.spawning would have an unfriendly name of spawning . |
getPackageVersion |
<pjson> |
Gets a package's version. |
getProjectVersion |
<psettings> |
Gets a project's version. |
getManifest |
<projectPath> |
Gets a project's manifest (Packages/manifest.json) file as a string. |
getProjectSettings |
<projectPath> |
Gets the project settings (ProjectSettings/ProjectSettings.asset) file as a string. |
getProjectName |
<psettings> |
Gets a project's (product) name. |
setProjectVersion |
<version> <projectPath> |
Sets a project version. |
getPackageSettings |
<packagePath> |
Gets the package settings (package.json) file as a string. |
hasPackageDepsToSync |
<packagePath> <projectPath> |
true if the passed package has dependencies to synchronize with the containing project, or if the editor version should be synchronized. |
setPackageVersion |
<version> <packagePath> |
Sets a package's version. |
syncPackageDeps |
<packagePath> <projectPath> |
Synchronizes package dependencies with those of the project, including the editor version. |
syncInternalRefs |
Synchronizes all packages internally referencing each other in the project so that the latest version is specified in their respective dependencies. |
By submitting a pull request, you agree to license your work under this project's MIT license.