{"id":3118,"url":"https://github.com/tmspzz/Rome","last_synced_at":"2025-08-03T13:31:55.693Z","repository":{"id":10283619,"uuid":"65207805","full_name":"tmspzz/Rome","owner":"tmspzz","description":"Carthage cache for S3, Minio, Ceph, Google Storage, Artifactory and many others ","archived":false,"fork":false,"pushed_at":"2023-01-25T03:26:12.000Z","size":1025,"stargazers_count":815,"open_issues_count":35,"forks_count":57,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-05-21T06:12:10.296Z","etag":null,"topics":["aws","aws-s3","cache","carthage","ceph","cocoapods","fastlane","fastlane-plugin","framework","hacktoberfest","ios","macos","minio","package-manager","s3","swift","tool","tvos","watchos"],"latest_commit_sha":null,"homepage":"","language":"Haskell","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/tmspzz.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":"FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"tmspzz"}},"created_at":"2016-08-08T13:47:49.000Z","updated_at":"2024-05-20T17:43:25.000Z","dependencies_parsed_at":"2023-02-14T04:10:41.673Z","dependency_job_id":null,"html_url":"https://github.com/tmspzz/Rome","commit_stats":null,"previous_names":[],"tags_count":64,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmspzz%2FRome","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmspzz%2FRome/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmspzz%2FRome/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmspzz%2FRome/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tmspzz","download_url":"https://codeload.github.com/tmspzz/Rome/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228548567,"owners_count":17935221,"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":["aws","aws-s3","cache","carthage","ceph","cocoapods","fastlane","fastlane-plugin","framework","hacktoberfest","ios","macos","minio","package-manager","s3","swift","tool","tvos","watchos"],"created_at":"2024-01-05T20:16:31.900Z","updated_at":"2024-12-07T01:30:35.659Z","avatar_url":"https://github.com/tmspzz.png","language":"Haskell","funding_links":["https://github.com/sponsors/tmspzz"],"categories":["Haskell","Dependency / Package Manager","HarmonyOS","aws"],"sub_categories":["Getting Started","Web View","Windows Manager"],"readme":"![](logo/colosseum.jpg)\n\n# Rome [![Build Status](https://travis-ci.org/tmspzz/Rome.svg?branch=master)](https://travis-ci.org/tmspzz/Rome) [![rome-latest](https://img.shields.io/badge/release-v0.24.0.65-blue.svg)](https://github.com/tmspzz/Rome/releases/tag/v0.24.0.65) ![cocoapods](https://img.shields.io/cocoapods/v/Rome.svg) ![total-downloads](https://img.shields.io/github/downloads/tmspzz/Rome/total.svg) [![fastlane-plugin -badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://github.com/OpenShelter/fastlane-plugin-rome) [![twitter-follow](https://img.shields.io/twitter/follow/tmpz.svg?style=social\u0026label=Follow)](https://twitter.com/tmpz)\n\nRome is a tool that allows developers on Apple platforms to use:\n\n- Amazon's S3\n- [Minio](https://www.minio.io/)\n- [Ceph](https://ceph.com/ceph-storage/object-storage/)\n- other S3 compatible object stores\n- or/and a local folder\n- [your own custom engine](#custom-engine)\n\nas a shared cache for frameworks built with [Carthage](https://github.com/Carthage/Carthage).\n\nTrusted by: \n\n\u003cimg src=\"https://storage.googleapis.com/pr-newsroom-wp/1/2018/11/Spotify_Logo_CMYK_Green.png\" alt=\"Spotify\" height=\"90px\"/\u003e\u003c/a\u003e\u003ca href=\"https://line.me\"\u003e\u003cimg src=\"https://vignette.wikia.nocookie.net/starwars/images/b/b1/LINE_Corp_logo.png/revision/latest?cb=20170923181031\" alt=\"linecorp\" height=\"90px\"/\u003e\u003c/a\u003e\n\n\u003ca href=\"https://www.mozilla.com\"\u003e\u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Mozilla_logo.svg/2000px-Mozilla_logo.svg.png\" alt=\"Mozilla\" height=\"90px\"/\u003e\u003c/a\u003e \u003ca href=\"https://www.brave.com\"\u003e\u003cimg src=\"https://brave.com/wp-content/uploads/2019/03/brave-logo-1.png\" alt=\"Brave\" height=\"90px\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://www.daimler-tss.com\"\u003e\u003cimg src=\"https://www.hdm-stuttgart.de/unternehmen/karrieremarktplatz/anmeldung/aussteller_uploads/99/dLlVePMVtu191516349018.png\" alt=\"DaimlerTSS\" height=\"90px\"/\u003e\u003c/a\u003e\n\n\u003ca href=\"https://labs.spotify.com/2019/10/23/when-in-rome-how-spotify-halved-build-times-with-just-one-script/\"\u003e\u003ca href=\"https://www.sharecare.com\"\u003e\u003cimg src=\"https://about.sharecare.com/wp-content/uploads/2019/07/sc-logo-horiz-1.png\" alt=\"sharecare\" height=\"40px\"/\u003e\u003c/a\u003e\u003ca href=\"https://disney.com\"\u003e\u003cimg src=\"https://purepng.com/public/uploads/thumbnail/purepng.com-disney-logologobrand-logoiconslogos-251519939495is1hl.png\" alt=\"Disney\" height=\"40px\"/\u003e\u003c/a\u003e\n\n\n[Search Github](https://github.com/search?utf8=%E2%9C%93\u0026q=filename%3ARomefile\u0026type=Code)\n\n**Table of Contents**\n\n- [Get Rome](#get-rome)\n- [Use Rome with fastlane](#use-rome-with-fastlane)\n- [The problem](#the-problem)\n- [The solution](#the-solution)\n- [Workflow](#workflow)\n\t- [Producer workflow](#producer-workflow)\n\t- [Consumer workflow](#consumer-workflow)\n\t- [CI workflow](#ci-workflow)\n- [Set up](#set-up)\n\t- [Setting up AWS credentials](#setting-up-aws-credentials)\n\t- [Selecting the AWS Region](#selecting-the-aws-region)\n\t- [Setting up endpoint override for Minio, Ceph, or other S3 compatible stores](#setting-up-endpoint-override)\n  - [Custom Engine](#custom-engine)\n\t- [Romefile](#romefile)\n\t\t- [Cache](#cache)\n\t\t- [RepositoryMap](#repositorymap)\n\t\t- [IgnoreMap](#ignoremap)\n\t\t- [CurrentMap](#currentmap)\n\t\t- [Multiple Aliases](#multiple-aliases)\n\t\t- [Static Frameworks](#static-frameworks)\n\t\t- [Platforms](#platforms)\n\t- [Cache Structure](#cache-structure)\n\t\t- [Cache Prefix](#cache-prefix)\n- [Usage](#usage)\n\t- [Uploading](#uploading)\n\t- [Downloading](#downloading)\n\t- [Listing](#listing)\n  - [Utils](#utils)\n- [Troubleshooting \u0026 FAQ](#troubleshooting--faq)\n\t- [Getting \"Image not found\" when running an application using binaries](#getting-image-not-found-when-running-an-application-using-binaries)\n\t- [Supporting multiple Swift Versions](#supporting-multiple-swift-versions)\n- [Developing](#developing)\n- [Releasing](#releasing)\n- [Presentations and Tutorials](#presentations-and-tutorials)\n- [License](#license)\n\n## Get Rome\n### Using Homebrew\n```\n$ brew tap tmspzz/tap https://github.com/tmspzz/homebrew-tap.git\n$ brew install tmspzz/homebrew-tap/rome\n```\n### Using CocoaPods\nSimply add the following line to your Podfile:\n```\npod 'Rome'\n```\n\nThis will download Rome to the `Pods/` folder during your next `pod install`\nexecution and will allow you to invoke it via `${PODS_ROOT}/Rome/rome` in your\nScript Build Phases.\n\n### Manual\n\nThe Rome binary is also attached as a zip to each release on the [releases page](https://github.com/tmspzz/Rome/releases) here on GitHub.\n\nUsing Rome? Let me know by [opening an issue](https://github.com/tmspzz/Rome/issues/new)\nand I will gladly add you to the user list.\n\n## Use Rome with fastlane\n\nYou can integrate Rome into your [fastlane](https://github.com/fastlane/fastlane) automation with the\n[fastlane plugin for Rome](https://github.com/netbe/fastlane-plugin-rome).\n\n## The problem\n\nSuppose you're working a number of frameworks for your project and want to\nshare those with your team. A great way to do so is to use Carthage and\nhave team members point the `Cartfile` to the new framework version (or branch, tag, commit)\nand run `carthage update`.\n\nUnfortunately this will require them to build from scratch the new framework.\nThis is particularly annoying if the dependency tree for that framework is big\nand / or takes a long time to build.\n\n## The solution\n\nUse a cache. The first team member (or a CI) can build the framework and share it, while all\nother developers can get it from the cache with no waiting time.\n\n## Workflow\n\nThe Rome's workflow changes depending if you are the producer (i.e. the first\nperson in your team to build the framework) or the consumer.\n\n### Producer workflow\n\n```bash\n$ vi Cartfile # point to the new version of the framework\n$ carthage update \u0026\u0026 rome upload\n```\n\nIf you are running Rome in the context of a framework and want to [upload](#uploading) the current framework see [CurrentMap](#currentmap).\n\n### Consumer workflow\n\n```bash\n$ vi Cartfile # point to the new version of the framework if necessary\n$ carthage update --no-build \u0026\u0026 rome download\n```\n\nor\n\n```bash\n$ vi Cartfile.resolved # point to the new version of the framework\n$ rome download\n```\n\nIf you are running Rome in the context of a framework and want to [download](#downloading) the current framework see [CurrentMap](#currentmap).\n\n### CI workflow\n\nA CI can be both consumer and producer.\n\nA simple workflow for using Rome on a continuous integration should resemble the\nfollowing:\n\n- get available artifacts\n- check if any artifacts are missing\n- build missing artifacts if any\n- upload build artifacts to the cache if needed\n\nYou can use the [fastlane plugin for Rome](#use-rome-with-fastlane) to implement\na CI workflow too.\n\nIf you are running Rome in the context of a framework and want to [upload](#uploading) or [download](#downloading) the current framework see [CurrentMap](#currentmap).\n\n#### `--cache-builds` workflow (recommended)\n\nThis workflow relies on `.version` files being produced by Carthage.\nThis means that you have to invoke `carthage` with `--cache-builds` for this to work.\n\nIn code:\n\n```sh\n#!/bin/bash\nrome download --platform iOS # download missing frameworks (or copy from local cache)\ncarthage bootstrap --platform iOS --cache-builds # build dependencies missing a .version file or that where not found in the cache\nrome list --missing --platform iOS | awk '{print $1}' | xargs -I {} rome upload \"{}\" --platform iOS # upload what is missing\n```\n\n#### List workflow\n\nThis workflow relies on querying the cache to check for missing dependencies and then selectively telling Carthage what to build.\n__This flow is more fragile__ as Carthage will refuse to build indirect dependencies.\n\nIn code:\n\n```sh\n#!/bin/bash\nrome download --platform iOS # download missing frameworks (or copy from local cache)\nrome list --missing --platform iOS | awk '{print $1}' | xargs -I {} carthage bootstrap \"{}\" --platform iOS --cache-builds # list what is missing and update/build if needed\nrome list --missing --platform iOS | awk '{print $1}' | xargs -I {} rome upload \"{}\" --platform iOS # upload what is missing\n```\n\nIf no frameworks are missing, the `awk` pipe to `carthage` will fail and the rest of the command will not be executed. This avoids rebuilding all dependencies or uploading artifacts already present in the cache.\n\n## Set up\n\nIf you plan to use Amazon's S3 as a cache, then follow the next three steps:\n\n- First you need a `.aws/credentials` file in your home folder. This is used to specify\nyour [AWS Credentials](#setting-up-aws-credentials).\n- Second you need a `.aws/config` file in your home folder. This is used to specify the [AWS\nRegion](#selecting-the-aws-region).\n- Third you need a [Romefile](#romefile) in the project where you want to use Rome. At the\nsame level where the `Cartfile` is.\n\nIf you just want to use only a local folder as a cache then:\n\n- You need a [Romefile](#romefile) in the project where you want to use Rome. At the\nsame level where the `Cartfile` is. Since `0.17.1.49`, if you want to place the Romefile elsewhere or name it differently\nuse `--romefile \u003cpath-to-romefile\u003e` when running `rome \u003cCOMMAND\u003e`.\n\n### Setting up AWS credentials\n\nSince version `0.2.0.0` Rome will expect to find credentials either as environment\nvariables `$AWS_ACCESS_KEY_ID` and `$AWS_SECRET_ACCESS_KEY` or in a file at\n`.aws/credentials`. This aligns Rome behavior to other tools that use Amazon's SDK. See\n[Amazon's blogpost on the topic](https://blogs.aws.amazon.com/security/post/Tx3D6U6WSFGOK2H/A-New-and-Standardized-Way-to-Manage-Credentials-in-the-AWS-SDKs).\n\nIn your home folder create a `.aws/credentials` like the following\n\n```\n[default]\naws_access_key_id = ACCESS_KEY\naws_secret_access_key = SECRET_KEY\n```\n\nthis should look something like\n\n```\n[default]\naws_access_key_id = AGIAJQARMD67CE3DTKHA\naws_secret_access_key = TedRV2/dFkBr1H3D7xuPsF9+CBHTjK0NKrJuoVs8\n```\n\nthese will be the credentials that Rome will use to access S3 on your behalf.\nTo use configurations other than the `default` profile set the `$AWS_PROFILE`\nenvironment variable to your desired profile.\n\nSince version `0.21.0.58` Rome also supports privilege escalation via [Amazon STS](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html)\nby specifying `role_arn` and `source_profile` in `~/.aws/config`\n\n### Selecting the AWS Region\n\nIn your home folder create a `.aws/config` like the following\n\n```\n[default]\nregion = us-east-1\n```\n\nTo use configurations other than the `default` profile set the `$AWS_PROFILE`\nenvironment variable to your desired profile.\n\nAlternatively the AWS Region can also be specified by setting an `AWS_REGION` environment variable.\n\n### Setting up endpoint override\n\nTo your `.aws/config` in the profile section you wish to use, add an `endpoint` key like so\n\n```\n[default]\nregion = us-east-1\nendpoint = https://my.minio.host:9091\n```\n\n__Do not remove the `region` key__.\n\nDefault port for `https` endpoints is __443__ if the port is left unspecified.\n\nDefault port for `http` endpoints is __9000__ if the port is left unspecified.\n\nAlternatively the endpoint can also be specified by setting an `AWS_ENDPOINT` environment variable.\n\n### Custom Engine\nYou can write your own script that Rome will use as engine to execute upload/download/list commands. You start by specifying the path to a script or executable in your [Romefile](#romefile) as shown in the example [structure](#structure).\nRome will invoke the specified script or executable with three commands and different parameters based on the action to perform:\n\n- `./script.sh upload local-path remote-path`\n- `./script.sh download remote-path local-path`\n- `./script.sh list remote-path`\n\nFor example, if your [Romefile](#romefile) specifies `engine: script.sh`, Rome will execute the following command when uploading/downloading/listing a framework:\n```sh\n./script.sh upload Alamofire/iOS/Alamofire.framework-4.8.2.zip Alamofire/iOS/Alamofire.framework-4.8.2.zip\n./script.sh download Alamofire/iOS/Alamofire.framework-4.8.2.zip Alamofire/iOS/Alamofire.framework-4.8.2.zip\n./script.sh list Alamofire/iOS/Alamofire.framework-4.8.2.zip\n```\n\nThe script should take the given `remote-path`, carry out its logic to retrieve the artifact and place it at `local-path`. Please refer to the [cache structure](#cache-structure) definition for more information on the cache is constructed.\n\nFor an example of a custom engine, take a look at [engine.sh](https://github.com/tmspzz/Rome/blob/master/integration-tests/engine.sh) which is used in the integration tests to simply copy artifacts in a different directory. Infinite uses cases are opened by using a custom engine, such as uploading artifacts to any non-compatible S3 storage system.\n\nOther example engines:\n\n- [Google Storage](https://github.com/tmspzz/Rome/blob/master/example-engines/google.py) \n\n### Romefile\n\n#### About the format\nSince version `0.17.0.48` the Romefile is in [YAML](https://learnxinyminutes.com/docs/yaml/) format.\nRome can still read the [INI](https://en.wikipedia.org/wiki/INI_file) Romefile, for now.\n\n__Sucessive release might abandon compatibility__.\n\nFeature support that require additions or changes to the Romefile __won't be supported in INI__.\n\nYou can migrate your Romefile to YAML by running `rome utils migrate-romefile`.\n\nIf you are looking for the documention prior to `0.17.0.48`, check the [wiki](https://github.com/tmspzz/Rome/wiki/Romefile-prior-0.17.x.x)\n\n#### Purpose\n\nThe Romefile has three purposes:\n\n1. Specifies what caches to use - `cache` key. This key is __required__.\n1. Allows to use custom name mappings between repository names and framework names - `repositoryMap` key. This key is __optional__ and can be omitted.\n1. Allows to ignore certain framework names - `ignoreMap` key. This key is __optional__ and can be omitted.\n1. Allows to specify the current framework's name(s) - `currentMap` key. This key is __optional__ and can be omitted.\n\n#### Structure\n\nA Romefile is made of 4 objects, of which only one, the `cache`, is required.\n\n- A `cache` definition object\n- A `repositoryMap` made of a list of `Romefile Entry`\n- An `ignoreMap` made of a list of `Romefile Entry`\n- A `currentMap` made of a list of `Romefile Entry`\n\nEach `Romefile Entry` is made of:\n\n- A `name`\n- A `type` which can be `static` or `dynamic`\n- A set of supported `platforms` including `iOS`, `Mac`, `tvOS`, `watchOS`\n\nA Romefile looks like this:\n\n```yaml\ncache: # required\n  # at least one of the following is required:\n  local: ~/Library/Caches/Rome # optional and can be combined with either a `s3Bucket` or `engine`\n  s3Bucket: ios-dev-bucket # optional and can be combined with `local`\n  engine: script.sh # optional and can be combined with `local`\n                    \nrepositoryMap: # optional\n- better-dog-names: # entry that does not follow\n                    # the \"Organization/FrameworkName\" convention.\n  - name: DogFramework # required\n    type: static # optional, defaults to dynamic\n- HockeySDK-iOS:\n  - name: HockeySDK\n    platforms: [iOS] # optional, all platforms if empty\n- awesome-framework-for-cat-names:\n  - name: CatFramework\n    type: dynamic\nignoreMap:\n- GDCWebServer:\n  - name: GDCWebServer\ncurrentMap:\n- animal-names-framework:\n  - name: AnimalNames\n```\n\n#### Cache\nThe cache __must__ contain __at least one__ between:\n- the name of the S3 Bucket to upload/download to/from. The key `s3Bucket` is __optional__.\n- the path to local directory to use as an additional cache. The key `local` is __optional__.\n- the path to a custom engine to use as an additional cache. The key `engine` is __optional__.\n\n```yaml\ncache: # required\n  local: ~/Library/Caches/Rome # optional\n                               # at least one between `local`, `s3bucket` and `engine` is required\n  s3Bucket: ios-dev-bucket # optional\n                           # at least one between `local`, `s3bucket` and `engine` is required\n  engine: script.sh        # optional\n                           # at least one between `local`, `s3bucket` and `engine` is required\n```\n\nThis is already a viable Romefile.\n\n#### RepositoryMap\nThis contains the mappings of repository and framework names.\nThis is particularly useful if dependecies are not on GitHub or don't respect the \"Organization/FrameworkName\" convention.\n\nExample:\n\nSuppose you have the following in your `Cartfile`\n\n```\ngithub \"Alamofire/Alamofire\" ~\u003e 4.3.0\ngithub \"bitstadium/HockeySDK-iOS\" \"3.8.6\"\ngit \"http://stash.myAnimalStartup.com/scm/iossdk/awesome-framework-for-cat-names.git\" ~\u003e 3.3.1\ngit \"http://stash.myAnimalStartup.com/scm/iossdk/better-dog-names.git\" ~\u003e 0.4.4\n```\n\nwhich translates to the following `Cartfile.resolved`\n\n```\ngithub \"Alamofire/Alamofire\" \"4.3.0\"\ngithub \"bitstadium/HockeySDK-iOS\" \"3.8.6\"\ngit \"http://stash.myAnimalStartup.com/scm/iossdk/awesome-framework-for-cat-names.git\" \"3.3.1\"\ngit \"http://stash.myAnimalStartup.com/scm/iossdk/better-dog-names.git\" \"0.4.4\"\n```\n\nbut your framework names are actually `HockeySDK`, `CatFramework` and `DogFramework`\nas opposed to `HockeySDK-iOS`, `awesome-framework-for-cat-names` and `better-dog-names`.\n\nsimply add a `repositoryMap` key to your `Romefile` and specify the following mapping:\n\n```yaml\ncache:\n  local: ~/Library/Caches/Rome \nrepositoryMap:\n- better-dog-names: # this is the Romefile Entry for  `better-dog-names`\n  - name: DogFramework\n    type: static\n    platforms: [iOS, Mac]\n- HockeySDK-iOS: # this is the Romefile Entry for  `HockeySDK-iOS`\n  - name: HockeySDK\n    platforms: [iOS]\n- awesome-framework-for-cat-names:  # this is the Romefile Entry for  `awesome-framework-for-cat-names`\n  - name: CatFramework\n  - type: dynamic\n```\n\nNote that __it was not necessary to add Alamofire__ as it respects the \"Organization/FrameworkName\" convention.\n\n#### IgnoreMap\nThis contains the mappings of repository and framework names that should be ignored.\nThis is particularly useful in case not all your `Cartfile.resolved` entries produce a framework.\n\nSome repositories use Carthage as a simple mechanism to include other git repositories that do not produce frameworks.\nEven Carthage itself does this, to include xcconfigs.\n\n\nExample:\n\nSuppose you have the following in your `Cartfile`\n\n```\ngithub \"Quick/Nimble\"\ngithub \"jspahrsummers/xcconfigs\"\n```\n\n`xcconfigs` can be ignored by Rome by adding an `ignoreMap` key in the Romefile\n\n\n```yaml\nignoreMap:\n- xcconfigs:\n  - name: xcconfigs\n```\n\nEach entry in the `IgnoreMap` is also a `Romefile Entry` and supports all keys.\n\n#### CurrentMap\n__By default the `currentMap` is not used__. Specify `--no-skip-current` as a command line option to use it.\nIt is supported by Rome versions greater than `0.18.x.y` and can be specified only in YAML. \n\nThe `currentMap` contains the mappings of repository and framework name(s) that describe the current framework.\nThis is particularly useful if you want to use Rome in the context of a framework. It is the [equivalent](https://github.com/Carthage/Carthage#share-your-xcode-schemes) of\n[Carthage's `--no-skip-current`](https://github.com/Carthage/Carthage#use-travis-ci-to-upload-your-tagged-prebuilt-frameworks).\n\n```yaml\ncurrentMap:\n- Alamofire:\n  - name: Alamofire\n```\n\nEach entry in the `currentMap` is also a `Romefile Entry` and supports all keys.\n\nThe `currentMap` is __subject to the ignores specified in the `ignoreMap`__. \nIf you explicitly specify names of frameworks to [upload](#uploading), [download](#downloading) on the command line, \nyou don't need to pass `--no-skip-current` to use the `currentMap`. Just specify the name(s) of the current framework.\n\nThe version of the current framework is determined by\n\n```\ngit describe --tags --exact-match `git rev-parse HEAD`\n```\n\n__If the commands does not resolve to any tag, the HEAD commit hash from `git rev-parse HEAD` is used as version.__\n\nIn order for `--no-skip-current` to work, make sure to run `carthage archive` to create an artifact to cache.\n\n#### Multiple Aliases\n\nSuppose you have a framework `Framework` that builds two targets, `t1` and `t2`,\nRome can handle both targets by specifying\n\n```yaml\nrepositoryMap:\n- Framework:\n  - name: t1\n  - name: t2\n```\n\n__Note__: if __ANY__ of the aliases is missing on S3, the entire entry will be reported as missing\nwhen running `rome list [--missing]`\n\nMultiple aliases are supported in `ignoreMap` too\n\n#### Static Frameworks\n\nSince version [0.30.1](https://github.com/Carthage/Carthage/releases/tag/0.30.1) Carthage has support for Static Frameworks. \nTo indicate that one of the aliases is a Static Framework, modify the `repositoryMap` like so:\n\n```yaml\nrepositoryMap:\n- Framework:\n  - name: t1\n    type: static\n  - name: t2\n```\n\nIf left unspecified, an alias is a __Dynamic Framework by default__.\n\n#### Platforms\n\nSince version [0.17.1.49](https://github.com/tmspzz/Rome/releases/tag/v0.17.1.49) Rome allows you\nto specify what platforms are supported for a specific `Romefile Entry`. This serves a differet purpose\nthan the command line option `--platforms`.\n\n```yaml\nrepositoryMap:\n- Framework: \n  - name: t1\n    type: static\n    platforms: [iOS, Mac]\n  - name: t2\n```\n\nThe above means that `t1` is only available for `iOS` and `Mac`.\nThe `--platforms` command line options can be used to futher limit the Rome command to a\nspecific subset of the supported platfroms.\n\n### Cache Structure\n\nThe following describes the structure of the cache that Rome creates and manages.\n\nBy default frameworks, dSYMs and .bcsymbolmaps are placed in the cache (local and/or remote)\naccording to the following convention:\n\n```\n\u003cgit-repository-name\u003e/\u003cplatform\u003e/\u003cframework-name\u003e.framework(.dSYM)-(static-)\u003cversion-hash\u003e.zip\n\u003cgit-repository-name\u003e/\u003cplatform\u003e/\u003cbcsymbolmap-hash\u003e.bcsymbolmap-(static-)\u003cversion-hash\u003e.zip\n\n```\n\n[Carthage version files](https://github.com/Carthage/Carthage/blob/master/Documentation/VersionFile.md)\nare placed at:\n\n```\n\u003cgit-repository-name\u003e/.\u003cframework-name\u003e.version-(static-)\u003cversion-hash\u003e\n```\n\nFor example the cache for the `Cartfile.resolved` in [RepositoryMap](#repositorymap)\nwould look like the following\n\n```\n/Users/blender/Library/Caches/Rome/\n├── HockeySDK-iOS\n│   └── iOS\n│       ├── HockeySDK.framework-3.8.6.zip\n│       ├── HockeySDK.framework.dSYM-3.8.6.zip\n│       └── D034377A-B469-3819-97A7-1DC0AA293AC3.bcsymbolmap\n├── awesome-framework-for-cat-names\n│\t\t├── iOS\n│\t\t│   ├── CatFramework.framework-883eea474e3932607988d4e74bf50c9799bfd99a.zip\n│\t\t│   └── CatFramework.framework.dSYM-883eea474e3932607988d4e74bf50c9799bfd99a.zip\n│\t\t├── tvOS\n│\t\t│   ├── CatFramework.framework-883eea474e3932607988d4e74bf50c9799bfd99a.zip\n│\t\t│   └── CatFramework.framework.dSYM-883eea474e3932607988d4e74bf50c9799bfd99a.zip\n│\t\t└── .CatFramework.version-883eea474e3932607988d4e74bf50c9799bfd99a\n└─── better-dog-names\n\t\t├── iOS\n\t\t│   ├── DogFramework.framework-v4.0.0.zip\n\t\t│   └── DogFramework.framework.dSYM-v4.0.0.zip\n\t\t├── Mac\n\t\t│   ├── DogFramework.framework-v4.0.0.zip\n\t\t│   └── DogFramework.framework.dSYM-v4.0.0.zip\n\t\t└── .DogFramework.version-v4.0.0\n```\n#### Cache Prefix\n\nSince version `0.12.0.31` Rome supports prefixes for top level directories in your\ncaches. You can append `--cache-prefix MY_PREFIX` to all commands.\nThis simply means that both the framework/dSYM and .version file conventional\nlocations can be prefixed by another directory of your choosing. Thus the conventions\nbecome:\n\n```\n\u003cMY_PREFIX\u003e/\u003cgit-repository-name\u003e/\u003cplatform\u003e/\u003cframework-name\u003e.framework(.dSYM)-\u003cversion-hash\u003e.zip\n```\n\nand\n\n```\n\u003cMY_PREFIX\u003e/\u003cgit-repository-name\u003e/.\u003cframework-name\u003e.version-\u003cversion-hash\u003e\n```\n\nThis is particularly useful when the need to cache frameworks at the same version\nbut build with different versions of the compiler arises.\n\nSuppose you want to cache v4.0.0 of `DogFramework` build for\nSwift2.1/Swift3.1/Swift3.2/Swift4. Once built you can upload each build with the same\nversion number to a separate top level directory in the cache via the `--cache-prefix`\noption.\n\nThus running for the Swift2.1 build\n\n```\n$ rome upload better-dog-names --platform iOS # note there is no prefix here\n```\n\nand running for the the Swift3.2 build\n\n```\n$ rome upload better-dog-names --platform iOS --cache-prefix Swift_3_2\n```\n\nwould lead to the following cache structure\n\n```\n/Users/blender/Library/Caches/Rome/\n├── better-dog-names\n│   ├── iOS\n│   │   ├── DogFramework.framework-v4.0.0.zip\n│   │   └── DogFramework.framework.dSYM-v4.0.0.zip\n│   └── .DogFramework.version-v4.0.0-iOS\n└── Swift_3_2\n    └── better-dog-names\n        ├── iOS\n        │   ├── DogFramework.framework-v4.0.0.zip\n        │   └── DogFramework.framework.dSYM-v4.0.0.zip\n        └── .DogFramework.version-v4.0.0-iOS\n```\n\n## Usage\n\nGetting help:\n\n```bash\n$ rome --help\nCache tool for Carthage\n\nUsage: rome COMMAND [-v]\n\nAvailable options:\n  -h,--help                Show this help text\n  --version                Prints the version information\n  -v                       Show verbose output\n\nAvailable commands:\n  upload                   Uploads frameworks and dSYMs contained in the local\n                           Carthage/Build/\u003cplatform\u003e to S3, according to the\n                           local Cartfile.resolved\n  download                 Downloads and unpacks in Carthage/Build/\u003cplatform\u003e\n                           frameworks and dSYMs found in S3, according to the\n                           local Cartfile.resolved\n  list                     Lists frameworks in the cache and reports cache\n                           misses/hits, according to the local\n                           Cartfile.resolved. Ignores dSYMs.\n  utils                    A series of utilities to make life easier. `rome\n                           utils --help` to know more\n```\n\n### Uploading\n\nUploading one or more frameworks, corresponding dSYMs, .bcsymbolmaps and [Carthage version files](https://github.com/Carthage/Carthage/blob/master/Documentation/VersionFile.md)\nif present (an empty list of frameworks will upload all frameworks found in `Cartfile.resolved`):\n\nReferring to the `Cartfile.resolved` in [RepositoryMap](#repositorymap)\n\n```bash\n$ rome upload Alamofire\nUploaded Alamofire to: Alamofire/iOS/Alamofire.framework-4.3.0.zip\nUploaded Alamofire.dSYM to: Alamofire/iOS/Alamofire.framework.dSYM-4.3.0.zip\nUploaded Alamofire to: Alamofire/tvOS/Alamofire.framework-4.3.0.zip\nUploaded Alamofire.dSYM to: Alamofire/tvOS/Alamofire.framework.dSYM-4.3.0.zip\nUploaded Alamofire to: Alamofire/watchOS/Alamofire.framework-4.3.0.zip\nUploaded Alamofire.dSYM to: Alamofire/watchOS/Alamofire.framework.dSYM-4.3.0.zip\n```\n\nUploading for a specific platform (all platforms are uploaded by default):\n\n```bash\n$ rome upload --platform ios Alamofire\nUploaded Alamofire to: Alamofire/iOS/Alamofire.framework-4.3.0.zip\nUploaded Alamofire.dSYM to: Alamofire/iOS/Alamofire.framework.dSYM-4.3.0.zip\n```\n\nIf a local cache is specified in your `Romefile` and you wish to ignore it pass `--skip-local-cache` on the command line.\n\nSince version `0.20.0.56`, if you are on a fast Internet connection you can use the `--concurrently` flag to maximise concurrency for the operation and maximise bandwith use. Using the `--concurrently` flag should result in a __x3 speedup__.\n\n### Downloading\n\nDownloading one or more frameworks, corresponding dSYMs, .bcsymbolmaps and\n[Carthage version files](https://github.com/Carthage/Carthage/blob/master/Documentation/VersionFile.md)\nif present\n(an empty list of frameworks will download all frameworks found in `Cartfile.resolved`):\n\nReferring to the `Cartfile.resolved` in [RepositoryMap](#repositorymap)\n\n```bash\n$ rome download Alamofire\nDownloaded Alamofire from: Alamofire/iOS/Alamofire.framework-4.3.0.zip\nDownloaded Alamofire.dSYM from: Alamofire/iOS/Alamofire.framework.dSYM-4.3.0.zip\nError downloading Alamofire : The specified key does not exist.\nError downloading Alamofire.dSYM : The specified key does not exist.\nDownloaded Alamofire from: Alamofire/tvOS/Alamofire.framework-4.3.0.zip\nDownloaded Alamofire.dSYM from: Alamofire/tvOS/Alamofire.framework.dSYM-4.3.0.zip\nDownloaded Alamofire from: Alamofire/watchOS/Alamofire.framework-4.3.0.zip\nDownloaded Alamofire.dSYM from: Alamofire/watchOS/Alamofire.framework.dSYM-4.3.0.zip\n```\n\nDownloading for a specific platform (all platforms are downloaded by default):\n\n```bash\n$ rome download --platform ios,watchos Alamofire\nDownloaded Alamofire from: Alamofire/iOS/Alamofire.framework-4.3.0.zip\nDownloaded Alamofire.dSYM from: Alamofire/iOS/Alamofire.framework.dSYM-4.3.0.zip\nDownloaded Alamofire from: Alamofire/watchOS/Alamofire.framework-4.3.0.zip\nDownloaded Alamofire.dSYM from: Alamofire/watchOS/Alamofire.framework.dSYM-4.3.0.zip\n```\n\nIf a local cache is specified in your `Romefile` and you wish to ignore it pass `--skip-local-cache` on the command line.\n\nSince version `0.20.0.56`, if you are on a fast Internet connection you can use the `--concurrently` flag to maximise concurrency for the operation and maximise bandwith use. Using the `--concurrently` flag should result in a __x3 speedup__.\n\n### Listing\n\nListing frameworks and reporting on their availability:\n\n```bash\n$ rome list\nAlamofire 4.3.0 : +iOS -macOS +tvOS +watchOS\nResearchKit 1.4.1 : +iOS -macOS -tvOS -watchOS\n```\n\nListing only frameworks present in the cache:\n\n```bash\n$ rome list --present\nAlamofire 4.3.0 : +iOS +tvOS +watchOS\nResearchKit 1.4.1 : +iOS\n```\n\nListing only frameworks missing from the cache:\n\n```bash\n$ rome list --missing\nAlamofire 4.3.0 : -macOS\nResearchKit 1.4.1 : -macOS -tvOS -watchOS\n```\n\nListing frameworks missing for specific platforms:\n\n```bash\n$ rome list --missing --platform watchos,tvos\nResearchKit 1.4.1 : -tvOS -watchOS\n```\n\nForwarding a list of missing frameworks to Carthage for building:\n\n```bash\n$ rome list --missing --platform ios | awk '{print $1}' | xargs -I {} carthage build \"{}\" --platform ios\n*** xcodebuild output can be found in ...\n```\n\nSince version `0.13.0.33` list results can also be printed as JSON by specifying `--print-format=JSON`\n\nNote: `list` __completely ignores dSYMs, bcsymbolmap and Carthage version files__. If a dSYM\nor a [Carthage version file](https://github.com/Carthage/Carthage/blob/master/Documentation/VersionFile.md)\nis missing, __the corresponding framework is still reported as present__.\n\n### Utils\n\nA collection of utilities to make life easier.\n\n### migrate-romefile\n\nMigrate the Romefile from INI to YAML __in place__, by running:\n\n`rome utils migrate-romefile`\n\n\n## Troubleshooting \u0026 FAQ\n\n### Getting \"Image not found\" when running an application using binaries\n\nImplicit dependencies of frameworks when using binaries are not copied over by Xcode automatically despite \"Always Embed Standard Libraries\" set to **YES** (see [56](/tmspzz/Rome/issues/56)).\n\nHere is an example with ReactiveCocoa, which depends on CoreLocation and MapKit. If ReactiveCocoa is built via Carthage or as a Xcode subproject, CoreLocation and MapKit are copied into the app's bundle. On the other hand, when using the binary, Xcode has no clue of that and does not copy the necessary frameworks even if \"Always Embed Standard Libraries\" is set to yes.\n\nTo fix that, add an explicit import statement to one of your files:\n\n```swift\n// Implicit ReactiveCocoa Dependencies\n\nimport CoreLocation\nimport MapKit\n```\n\n### Supporting multiple Swift Versions\n\nStoring artifacts or a the same famework at different Swift versions can be\nachieved by specifying a cache prefix when using any Rome command like so:\n\n```\n$ rome upload --platform iOS --cache-prefix Swift3 Alamofire\n$ rome download --platform iOS --cache-prefix Swift3 Alamofire\n$ rome list --platform iOS --cache-prefix Swift3\n```\n\nIf you prefer a more accurate way of generating cache prefixes for different swift versions\nconsider using the following:\n\n```\n--cache-prefix `xcrun swift --version | head -1 | sed 's/.*\\((.*)\\).*/\\1/' | tr -d \"()\" | tr \" \" \"-\"`\n```\n\nThe specified prefix is prepended to the git repository name in the caches.\nUsing a local cache path like `~/Library/Caches/Rome` will store Alamofire from\nthe example above at `~/Library/Caches/Rome/Swift3/Alamofire`\n\nSee [Cache Structure](#cache-structure) and [Cache Prefix](#cache-prefix)\nfor an in depth explanation.\n\n## Developing\n\n1. Install [Stack](https://github.com/commercialhaskell/stack) via homebrew `brew install stack`\n1. Clone the repo `git clone https://github.com/tmspzz/Rome.git`\n1. `cd Rome \u0026\u0026 stack build`\n1. Optional: Install brittany via `stack install brittany`\n1. Optional: Install hlint via `stack install hlint`\n\n### IDE\n\n1. Optional: If you use VIM install [haskell-vim-how](https://github.com/begriffs/haskell-vim-now)\n1. Optional: If you use [Visual Studio Code](https://code.visualstudio.com/) install [Haskero](https://marketplace.visualstudio.com/items?itemName=Vans.haskero)\n\n## Releasing\n\n1. Increase the version number in [Rome.cabal](https://github.com/tmspzz/Rome/blob/master/Rome.cabal#L2) \n1. Increase the version number in [app/Main.hs](https://github.com/tmspzz/Rome/blob/master/app/Main.hs#L13)\n1. Increase the version number in [Rome.podspec](https://github.com/tmspzz/Rome/blob/master/Rome.podspec#L3)\n1. Commit\n1. Create a [new pre-release](https://github.com/tmspzz/Rome/releases) on Github\n1. Attach the zipped binary\n1. Promote to release\n1. Run `pod trunk push Rome.podspec`\n1. [Update the homebrew formula](https://github.com/tmspzz/homebrew-tap)\n1. Run `bundle exec github_changelog_generator -u tmspzz -p Rome -t \u003cYourGitHubToken\u003e`\n1. Commit CHANGELOG.md\n\n\n## Presentations and Tutorials\n\nVideo tutorial on Rome given at [CocoaHeads Berlin](http://cocoaheads-berlin.org/) and [slides](https://speakerdeck.com/tmspzz/caching-a-simple-solution-to-speeding-up-build-times)\n\n- [Features](https://youtu.be/2cCIuidT9VA?t=387)\n- [Usage](https://youtu.be/2cCIuidT9VA?t=600)\n- [Romefile](https://youtu.be/2cCIuidT9VA?t=1104)\n\n[![cocoaheads-berlin-video-presentation](http://i.imgur.com/1vC8jYq.png)](https://www.youtube.com/watch?v=2cCIuidT9VA)\n\n[AppUnite article](https://appunite.com/blog/dependencies-ios-carthage) - comparison of popular approaches to building dependencies with Carthage by Szymon Mrozek \n\n## License\nRome is released under MIT License\n\nLogo courtesy of [TeddyBear[Picnic]](http://www.freedigitalphotos.net/images/view_photog.php?photogid=3407) at FreeDigitalPhotos.net\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmspzz%2FRome","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftmspzz%2FRome","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmspzz%2FRome/lists"}