{"id":15638680,"url":"https://github.com/bycedric/semantic-release-expo","last_synced_at":"2025-08-21T08:13:32.292Z","repository":{"id":40294786,"uuid":"134182687","full_name":"byCedric/semantic-release-expo","owner":"byCedric","description":"An Expo implementation for semantic release, so you don't have to bother.","archived":false,"fork":false,"pushed_at":"2023-01-03T16:13:40.000Z","size":1232,"stargazers_count":92,"open_issues_count":26,"forks_count":11,"subscribers_count":2,"default_branch":"develop","last_synced_at":"2024-04-25T08:21:57.158Z","etag":null,"topics":["expo","react-native","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":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/byCedric.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-05-20T20:06:03.000Z","updated_at":"2024-03-19T10:26:24.000Z","dependencies_parsed_at":"2023-02-01T07:46:20.131Z","dependency_job_id":null,"html_url":"https://github.com/byCedric/semantic-release-expo","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byCedric%2Fsemantic-release-expo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byCedric%2Fsemantic-release-expo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byCedric%2Fsemantic-release-expo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byCedric%2Fsemantic-release-expo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/byCedric","download_url":"https://codeload.github.com/byCedric/semantic-release-expo/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247773726,"owners_count":20993639,"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":["expo","react-native","semantic-release"],"created_at":"2024-10-03T11:22:26.834Z","updated_at":"2025-04-08T04:18:47.759Z","avatar_url":"https://github.com/byCedric.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Expo - Semantic Release\n\n[![Latest Release](https://img.shields.io/github/release/byCedric/semantic-release-expo/all.svg?style=flat-square)](https://github.com/byCedric/semantic-release-expo/releases)\n[![Build Status](https://img.shields.io/travis/com/byCedric/semantic-release-expo/master.svg?style=flat-square)](https://travis-ci.com/byCedric/semantic-release-expo)\n[![Codecov coverage](https://img.shields.io/codecov/c/github/byCedric/semantic-release-expo.svg?style=flat-square)](https://codecov.io/gh/byCedric/semantic-release-expo)\n[![Code Climate grade](https://img.shields.io/codeclimate/maintainability/byCedric/semantic-release-expo.svg?style=flat-square)](https://codeclimate.com/github/byCedric/semantic-release-expo)\n\nAn [Expo][expo] implementation for [semantic release][semantic-release], so you don't have to bother.\n\n![Example](docs/terminal.svg)\n\n## How it works\n\nSemantic release will first determine a new version based on your likings. \nThis plugin will then search for your [Expo manifest(s)][expo-manifest] and update it accordingly. \nNot only will this update the [`version`][expo-version] property within the manifest. \nIt will also update the [Android `versionCode`][expo-version-android] and [iOS `buildNumber`][expo-version-ios] platform too, based on the [configuration](#configuration).\n\n### Verify Conditions\n\nBefore such a smooth, carefree release can take place, the plugin must validate the existence of a manifest. \nThis check takes place in the [verify condition][semantic-release-steps] step of semantic release.\nThe name of the Expo app, defined in the [`name` property][expo-name], is dumped to console to provide some feedback for successful validation.\n\n### Prepare\n\nThis plugin writes the actual changes to the manifest during preparation.\nAfter this step, you can [publish to Expo][expo-publish], [create a new build][expo-build] or add the changes in a [release commit][semantic-release-commit].\nThe [`version` property][expo-version] within the manifest is always updated. \nAll of the platform specific changes are only applied when the platform is enabled.\n\n\u003e It is highly recommended to add the Expo manifest (`app.json`) to the [list of assets][semantic-release-assets] to include in the release commit.\n\n## Usage\n\nHere is an example configuration with automated changelogs, `package.json` versions, Expo and git release commits.\n\n```json\n{\n    \"verifyConditions\": [\n        \"semantic-release-expo\",\n        \"@semantic-release/changelog\",\n        \"@semantic-release/git\",\n        \"@semantic-release/npm\"\n    ],\n    \"prepare\": [\n        \"semantic-release-expo\",\n        \"@semantic-release/changelog\",\n        \"@semantic-release/npm\",\n        {\n            \"path\": \"@semantic-release/git\",\n            \"assets\": [\n                \"CHANGELOG.md\",\n                \"package.json\",\n                \"package-lock.json\",\n                \"app.json\"\n            ]\n        }\n    ],\n    \"publish\": false,\n    \"success\": false,\n    \"fail\": false\n}\n```\n\n## Configuration\n\nBy default this plugin uses configuration that should work straight out of the box.\nUnfortunately, all apps are different and sometimes requires a specific release flow.\nTo satisfy these needs, you can customize some of these settings below.\n\n### Multiple manifests\n\nNormally, an Expo app should have a single manifest located at `/app.json`.\nBut you might have good reasons to use non-standard or multiple manifests.\nFor example, if you need to [create multiple versions/flavours and allow then to work side-by-side][info-multiple-manifests], you need multiple manifests.\nTo configure this plugin, you can provide a list of manifests to update.\n\n```json\n{\n    \"prepare\": [\n        {\n            \"path\": \"semantic-release-expo\",\n            \"manifests\": [\n                \"app.test.json\",\n                \"app.staging.json\",\n                \"app.production.json\",\n            ]\n        }\n    ]\n}\n```\n\n\u003e `manifests` accepts either a single string, or a list of strings.\n\n### Version templates\n\nUnfortunately, right now there is no \"universal\" versioning which can be used across all platforms.\nFor exmaple, iOS can simply use the exact semantic version (e.g. `2.5.1`) but [Android can't][info-android-semver].\nTo allow multiple \"tactics\" or personal favorites, you can change the so called \"versioning templates\".\nThese templates uses [lodash template][lodash-template] to build new versions.\nEvery version string, `version`, `Android versionCode` and `iOS buildNumber` can be modified independently.\n\n```json\n{\n    \"prepare\": [\n        {\n            \"path\": \"semantic-release-expo\",\n            \"versions\": {\n                \"version\": \"${next.raw}\",\n                \"android\": \"${code}\",\n                \"ios\": \"${next.raw}\"\n            }\n        }\n    ]\n}\n```\n\n\u003e `versions` accepts either a single string for all versions, or a (partial) object with templates. By default the `${recommended}` template is used.\n\n#### Version templates variables\n\nCurrently the following variables are available within the templates.\n\nname        | type                    | description\n---         | ---                     | ---\nexpo        | [`SemVer`][info-semver] | The semver-coerced Expo SDK version\nlast        | [`SemVer`][info-semver] | The semver-coerced last release version\nnext        | [`SemVer`][info-semver] | The semver coerced next release version\ncode        | `Number`                | The (Android) version code, using the [versioning approach by Maxi Rosson][info-android-versioncode]\nincrement   | `Number`                | An incremented number of the previous version, [discouraged because of non-deterministic behaviour][repo-issue-increments].\nrecommended | `String` or `Number`    | _differs per versioning/platform, listed below_\n\n##### Recommended per version type\n\nversion                                     | example     | description\n---                                         | ---         | ---\n[version][expo-version]                     | `1.2.3`     | The \"raw\" next release version (also available in `${next.raw}`)\n[Android versionCode][expo-version-android] | `290010203` | The [versioning approach by Maxi Rosson][info-android-versioncode] (same as `${code}`)\n[iOS buildNumber][expo-version-ios]         | `1.2.3`     | The \"raw\" next release version (also available in `${next.raw}`)\n\n\u003e In these examples Expo SDK `29.x.x` and SemVer `1.2.3` is used.\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n\n[expo]: https://expo.io/\n[expo-build]: https://docs.expo.io/versions/latest/distribution/building-standalone-apps\n[expo-manifest]: https://docs.expo.io/versions/latest/workflow/configuration\n[expo-name]: https://docs.expo.io/versions/latest/workflow/configuration#name\n[expo-publish]: https://docs.expo.io/versions/latest/workflow/publishing\n[expo-version]: https://docs.expo.io/versions/latest/workflow/configuration#version\n[expo-version-android]: https://docs.expo.io/versions/latest/workflow/configuration#android\n[expo-version-ios]: https://docs.expo.io/versions/latest/workflow/configuration#ios\n[semantic-release]: https://github.com/semantic-release/semantic-release\n[semantic-release-assets]: https://github.com/semantic-release/git#assets\n[semantic-release-commit]: https://github.com/semantic-release/git#prepare\n[semantic-release-steps]: https://github.com/semantic-release/semantic-release#release-steps\n[lodash-template]: https://www.npmjs.com/package/lodash.template\n[info-multiple-manifests]: https://blog.expo.io/setting-up-expo-and-bitbucket-pipelines-8995ef036a18#e09a\n[info-android-semver]: https://github.com/semver/semver/issues/309\n[info-android-versioncode]: https://medium.com/@maxirosson/versioning-android-apps-d6ec171cfd82\n[info-semver]: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/257c8bc48a08620b77088af209ff3f4153221784/types/semver/index.d.ts#L152-L171\n[repo-issue-increments]: https://github.com/byCedric/semantic-release-expo/issues/4#issuecomment-417583573\n\n--- ---\n\n\u003cp align=\"center\"\u003e\n    with :heart: byCedric \u0026 \u003ca href=\"https://github.com/byCedric/semantic-release-expo/graphs/contributors\"\u003eContributors\u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbycedric%2Fsemantic-release-expo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbycedric%2Fsemantic-release-expo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbycedric%2Fsemantic-release-expo/lists"}