{"id":28125126,"url":"https://github.com/xing/rlsr","last_synced_at":"2025-05-14T09:20:30.504Z","repository":{"id":18264056,"uuid":"83910573","full_name":"xing/rlsr","owner":"xing","description":"create npm releses and changelogs from a mono repo","archived":false,"fork":false,"pushed_at":"2023-09-28T09:51:48.000Z","size":1479,"stargazers_count":5,"open_issues_count":6,"forks_count":2,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-22T14:53:55.454Z","etag":null,"topics":["commitizen","conventional-changelog","multirepo","npm","publishing","semantic-release"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xing.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-03-04T17:14:43.000Z","updated_at":"2022-12-14T22:41:08.000Z","dependencies_parsed_at":"2023-02-15T10:01:35.442Z","dependency_job_id":null,"html_url":"https://github.com/xing/rlsr","commit_stats":{"total_commits":261,"total_committers":11,"mean_commits":"23.727272727272727","dds":0.5670498084291188,"last_synced_commit":"1576ba280fde017fb751293bd6030d9b231da565"},"previous_names":["matthias-reis/rlsr"],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xing%2Frlsr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xing%2Frlsr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xing%2Frlsr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xing%2Frlsr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xing","download_url":"https://codeload.github.com/xing/rlsr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254110399,"owners_count":22016393,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["commitizen","conventional-changelog","multirepo","npm","publishing","semantic-release"],"created_at":"2025-05-14T09:20:17.485Z","updated_at":"2025-05-14T09:20:30.491Z","avatar_url":"https://github.com/xing.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rlsr\n\n[![Build Status](https://travis-ci.com/xing/rlsr.svg?branch=master)](https://travis-ci.com/xing/rlsr)\n\nManage automatic releases in a multi repo environment (comparable to lerna and\nlerna-semantic-release)\n\n## commitizen\n\nA prerequisite for using the automatic release according to semver standards is\nto stick to commits in the style of conventional changelog.\n\nThe easiest way to do this is using commitizen to replace the `git commit`\ncommand.\n\nBased on commits formatted like this\n\n```txt\nfix(my-package): description of contents\n\nBREAKING CHANGE: description of breaking stuff\n```\n\n## release process\n\nTaking these commit messages, the tool automatically\n\n- creates **changelogs**\n- updates **package.jsons** of the modules\n- updates package.jsons of the **related modules**\n- creates all needed **git tags**\n- persists everything as **git commit**s\n- finally **publish**es the relevant packages to npm\n\nFor this the following rules apply:\n\n- The type `feat` triggers a **minor** release\n- The types `fix`, `refactor`, `perf`, `revert`trigger a **patch** release\n- The word `BREAKING` somewhere in the message (subject or body) converts this\n  to a **major** release\n- The scope (sitting in brackets next to the type) is the most important part.\n  It determines which package is tackled with the commit\n\n## installation\n\nAs you would expect, you can simply install the package like\n\n```sh\nnpm install -D rlsr\n```\n\nand after that add it to your package.json\n\n```json\n{\n  ...\n  \"scripts\": {\n    \"prerelease\": \"rlsr pre\",\n    \"release\": \"rlsr perform\"\n  }\n  ...\n}\n```\n\n## usage\n\nFinally, you can use it for a dry run (without any persistence)\n`npm run prepublish` (or `rlsr pre`) and check what it has created.\n\nFor the full power you can persist these changes with git commits and tags as\nwell as the npm publish using `npm run release` (or `rlsr pre \u0026\u0026 rlsr perform`).\n\n## dependency management\n\n_rlsr_ understands two paradigms for handling dependencies from one monorepo\npackage to another.\n\n- _exact_: The versions of dependencies are handled exact and recursively. A\n  major bump for example leads to a patch bump of the related package and a\n  dependency like `5.0.0`.\n- _range_: The versions of dependencies are handled as a maximum range. A\n  related package is only bumped when the range exceeds. In this case the range\n  will be extended like `3.2.1 - 5`\n\n## api\n\nRLSR has some config values, that you can set inside your package.json in a\n`rlsr` section.\n\n- `verbose` (boolean): `true` creates a lot more output for debugging purposes.\n- `packagePath` (string): tells the system where the multi repo packages live\n  (defaults to `./packages`)\n- `exactRelations` (boolean): use the exact paradigm for related versions\n  (defaults to false)\n- `scopeToNameMap` (object): map commit message scopes to a different package\n  names. For example to use a shorter name in scopes or to handle renaming of\n  packages.\n- `additionalReleaseScope` (string): An npm scope (or orga) to use for double\n  publication under `package-name` and `@scope/package-name`. Has to start with\n  an `@`\n\n## rlsr-latest\n\nRLSR is able to fill in the latest version of a package to dependants. A\ndependant package just needs to use `rlsr-latest` instead of a concrete version\nin it's dependencies.\n\n```json\n{\n  \"my-package\"\n  \"dependencies\": {\n    \"my-dependency\": \"rlsr-latest\"\n  }\n}\n```\n\n## FAQ\n\n### How can I trigger a breaking change?\n\nThere are currently two criteria:\n\n- The commit message type would itself trigger at least a patch release (`feat`,\n  `fix`, `refactor`, `perf`, `revert`)\n- AND the message subject ot the message body contains at least the term\n  `BREAKING` in uppercase\n\nThe easiest way to achieve this is by using `commitizen` and enter something\nunder the BREAKING CHANGE topic.\n\n### What triggers a minor release?\n\nA message of type `feat(package-name)` triggers a minor release.\n\n### What triggers a minor release?\n\nA message of type `fix`, `refactor`, `perf` or `revert` triggers a minor\nrelease.\n\n### What does `previouslyUnreleased` in the package.json mean?\n\nThe two processes (`pre` and `perform`) are independent of each other. But they\nuse the main package.json as a amall data exchange layer.\n\n`pre` leaves `previouslyUnreleased` as an information for `perform`. It tells\nthe second process which components need to be published. `perform` finally\nremoves this again. But you may stumble upon this package.json entry at times.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxing%2Frlsr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxing%2Frlsr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxing%2Frlsr/lists"}