{"id":1891,"date":"2025-06-06T08:00:00","date_gmt":"2025-06-06T08:00:00","guid":{"rendered":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/"},"modified":"2025-06-06T08:00:00","modified_gmt":"2025-06-06T08:00:00","slug":"how-to-setup-a-swift-package-registry-in-artifactory","status":"publish","type":"post","link":"https:\/\/dev95.site\/ar\/how-to-setup-a-swift-package-registry-in-artifactory\/","title":{"rendered":"How to setup a Swift Package Registry in Artifactory"},"content":{"rendered":"<div id=\"dev95-2419024026\" class=\"dev95-- dev95-entity-placement\"><script async=\"async\" data-cfasync=\"false\" src=\"https:\/\/pl27862732.profitableratecpmnetwork.com\/2ad7a50e0bbc23ac6801d7b77c501463\/invoke.js\"><\/script>\r\n<div id=\"container-2ad7a50e0bbc23ac6801d7b77c501463\"><\/div><\/div><div>\n<h2 id=\"introduction\">Introduction<\/h2>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2025\/06\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg?w=1280&#038;ssl=1\" alt=\"How to setup a Swift Package Registry in Artifactory\"><\/p>\n<p>It&#8217;s very difficult to have GenAI not hallucinate when in comes to Swift Package Registry. No surprise there: the feature is definitely niche, has not been vastly adopted and there&#8217;s a lack of examples online. As Dave <a href=\"https:\/\/iosdevweekly.com\/issues\/696\/?ref=albertodebortoli.com\">put it<\/a>, <em>Swift Package Registries had an even rockier start compared to SPM.<\/em><\/p>\n<p>I&#8217;ve recently implemented a Swift Package Registry on Artifactory for my team and I thought of summarising my experience here since it&#8217;s still fresh in my head. While some details are left out, the happy path should be covered. I hope with this article to help you all indirectly by providing more material to the LLMs overlords.<\/p><div id=\"dev95-3300300906\" class=\"dev95- dev95-entity-placement\"><center>\r\n<script>\r\n  atOptions = {\r\n    'key' : '4ba6b6513c00e0ba76511f798ae56401',\r\n    'format' : 'iframe',\r\n    'height' : 50,\r\n    'width' : 320,\r\n    'params' : {}\r\n  };\r\n<\/script>\r\n<script src=\"https:\/\/www.highrevenueformat.com\/4ba6b6513c00e0ba76511f798ae56401\/invoke.js\"><\/script>\r\n\t<\/center><\/div>\n<h2 id=\"problem\">Problem<\/h2>\n<p>The main problem that led us to look into Swift Package Registry is due to SPM <a href=\"https:\/\/github.com\/swiftlang\/swift-package-manager\/blob\/7b98bedc91ac8b6581ed6785990ee62c97cde363\/Sources\/SourceControl\/GitRepository.swift?ref=albertodebortoli.com#L32\">deep-cloning<\/a> entire Git repositories for each dependency, which became time-consuming.<\/p>\n<p>Our CI jobs took a few minutes just to pull all the Swift packages. For dependencies with very large repositories, such as <a href=\"https:\/\/github.com\/sendbird\/sendbird-uikit-ios?ref=albertodebortoli.com\">SendbirdUIKit<\/a> (which is more than 2GB), one could rely on pre-compiled XCFrameworks as a workaround. Airbnb provides a workaround via the <a href=\"https:\/\/github.com\/airbnb\/lottie-spm?ref=albertodebortoli.com\">SPM-specific repo<\/a> for Lottie.<\/p>\n<p>A Swift Registry allows to serve dependencies as zip artifacts containing only the required revision, avoiding the deep clone of the git repositories.<\/p>\n<h2 id=\"what-is-a-swift-package-registry\">What is a Swift Package Registry?<\/h2>\n<p>A Swift Package Registry is a server that stores and vends Swift packages by implementing <a href=\"https:\/\/github.com\/swiftlang\/swift-evolution\/blob\/main\/proposals\/0292-package-registry-service.md?ref=albertodebortoli.com\">SE-0292<\/a> and the corresponding <a href=\"https:\/\/github.com\/swiftlang\/swift-package-manager\/blob\/main\/Documentation\/PackageRegistry\/Registry.md?ref=albertodebortoli.com\">specification<\/a>. Instead of relying on Git repositories to source our dependencies, we can use a registry to download them as versioned archives (zip files).<\/p>\n<figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https:\/\/github.com\/swiftlang\/swift-package-manager\/blob\/main\/Documentation\/PackageRegistry\/PackageRegistryUsage.md?ref=albertodebortoli.com\"><\/p>\n<div class=\"kg-bookmark-content\">\n<div class=\"kg-bookmark-title\">swift-package-manager\/Documentation\/PackageRegistry\/PackageRegistryUsage.md at main \u00b7 swiftlang\/swift-package-manager<\/div>\n<p><small><\/p>\n<div class=\"kg-bookmark-description\">The Package Manager for the Swift Programming Language &#8211; swiftlang\/swift-package-manager<\/div>\n<p><\/small><\/div>\n<p><\/a><\/figure>\n<p>The primary advantages of using a Swift Package Registry are:<\/p>\n<ul>\n<li><strong>Reduced CI\/CD Pipeline Times:<\/strong> by fetching lightweight zip archives from the registry rather than cloning the entire repositories from GitHub.<\/li>\n<li><strong>Improved Developer Machine Performance:<\/strong> the same time savings on CI are reflected on the developers&#8217; machines during dependency resolution.<\/li>\n<li><strong>Availability:<\/strong> by hosting a registry, teams are no longer dependent on the availability of external source control systems like GitHub, but rather on internal ones (for example, self-hosted Artifactory).<\/li>\n<li><strong>Security<\/strong>: injecting vulnerabilities in popular open-source projects is known as a\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Supply_chain_attack?ref=albertodebortoli.com\">supply chain attack<\/a>\u00a0and has become increasingly popular in recent years. A registry allows to adopt a process to trust the sources published on it.<\/li>\n<\/ul>\n<h2 id=\"platforms\">Platforms<\/h2>\n<p>Apple has accepted the Swift Registry specification and implemented support to interact with registries within SPM but has left the implementation of actual registries to third-party platforms.<\/p>\n<p>Apple is not in the business of providing a Swift Registry.<\/p>\n<p>The main platform having adopted Swift Registries is Artifactory.<\/p>\n<figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https:\/\/jfrog.com\/blog\/artifactory-your-swift-package-repository\/?ref=albertodebortoli.com\"><\/p>\n<div class=\"kg-bookmark-content\">\n<div class=\"kg-bookmark-title\">Artifactory, Your Swift Package Repository<\/div>\n<p><small><\/p>\n<div class=\"kg-bookmark-description\">JFrog now offers the first and only Swift binary package repository, enabling developers to use JFrog Artifactory for resolving Swift dependencies instead of enterprise source control (Git) systems.<\/div>\n<p><\/small><\/div>\n<p><\/a><\/figure>\n<p>although AWS CodeArtifact, Cloudsmith and Tuist provide support too:<\/p>\n<figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-add-your-swift-packages-to-aws-codeartifact\/?ref=albertodebortoli.com\"><\/p>\n<div class=\"kg-bookmark-content\">\n<div class=\"kg-bookmark-title\">New \u2013 Add Your Swift Packages to AWS CodeArtifact | Amazon Web Services<\/div>\n<p><small><\/p>\n<div class=\"kg-bookmark-description\">Starting today, Swift developers who write code for Apple platforms (iOS, iPadOS, macOS, tvOS, watchOS, or visionOS) or for Swift applications running on the server side can use AWS CodeArtifact to securely store and retrieve their package dependencies. CodeArtifact integrates with standard developer tools such as Xcode, xcodebuild, and the Swift Package Manager (the swift [\u2026]<\/div>\n<p><\/small><\/div>\n<p><\/a><\/figure>\n<figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https:\/\/cloudsmith.com\/product\/formats\/swift?ref=albertodebortoli.com\"><\/p>\n<div class=\"kg-bookmark-content\">\n<div class=\"kg-bookmark-title\">Private, secure, hosted Swift registry<\/div>\n<p><small><\/p>\n<div class=\"kg-bookmark-description\">Cloudsmith offers secure, private Swift registries as a service, with cloud native performance. Book a demo today.<\/div>\n<p><\/small><\/div>\n<p><\/a><\/figure>\n<figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https:\/\/tuist.dev\/blog\/2025\/01\/22\/announcing-tuist-registry?ref=albertodebortoli.com\"><\/p>\n<div class=\"kg-bookmark-content\">\n<div class=\"kg-bookmark-title\">Announcing Tuist Registry<\/div>\n<p><small><\/p>\n<div class=\"kg-bookmark-description\">We\u2019re thrilled to announce the launch of the Tuist Registry \u2013 a new feature that optimizes the resolution of Swift packages in your projects.<\/div>\n<p><\/small><\/div>\n<p><\/a><\/figure>\n<p>The benefits are usually appealing to teams with large apps, hence it&#8217;s reasonable to believe that only big companies have looked into adopting a registry successfully.<\/p>\n<h2 id=\"artifactory-setup\">Artifactory Setup<\/h2>\n<p>Let&#8217;s assume a JFrog Artifactory to host our Swift Package Registry exists at <a href=\"https:\/\/artifacts.takeaway.com\/?ref=albertodebortoli.com\">https:\/\/packages.acme.com<\/a>. Artifactory support local, remote, and virtual repositories but a realistic setup consists of only local and virtual repositories.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/speedmedia.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2022\/06\/03190625\/Artifactory_Swift_Flow.png?resize=1280%2C481&#038;ssl=1\" class=\"kg-image\" alt=\"How to setup a Swift Package Registry in Artifactory\" loading=\"lazy\" width=\"1280\" height=\"481\"><figcaption><span style=\"white-space: pre-wrap;\">Source: <\/span><a href=\"https:\/\/jfrog.com\/blog\/artifactory-your-swift-package-repository\/?ref=albertodebortoli.com\"><span style=\"white-space: pre-wrap;\">Artifactory<\/span><\/a><\/figcaption><\/figure>\n<p>Local Repositories are meant to be used for publishing dependencies from CI pipelines. Virtual Repositories are instead meant to be used for resolving (pulling) dependencies on both CI and the developers&#8217; machines. Remote repositories are not really relevant in a typical Swift Registry setup.<\/p>\n<p>Following the documentation at <a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-artifactory-documentation\/set-up-a-swift-registry?ref=albertodebortoli.com\">https:\/\/jfrog.com\/help\/r\/jfrog-artifactory-documentation\/set-up-a-swift-registry<\/a>, let&#8217;s create 2 repositories with the following names:<\/p>\n<ul>\n<li>local repository: <code>swift-local<\/code><\/li>\n<li>virtual repository: <code>swift-virtual<\/code><\/li>\n<\/ul>\n<h2 id=\"local-setup\">Local Setup<\/h2>\n<p>To pull dependencies from the Swift Package Registry, we need to configure the local environment.<\/p>\n<h3 id=\"1-set-the-registry-url\">1. Set the Registry URL<\/h3>\n<p>First, we need to inform SPM about the existence of the registry. We can do this on a per-project basis or globally for the user account.<\/p>\n<p>From a package&#8217;s root directory, run the following command. This will create a <code>.swiftpm\/configuration\/registries.json<\/code> file within your project folder.<\/p>\n<pre><code class=\"language-bash\">swift package-registry set \"https:\/\/packages.acme.com\/artifactory\/api\/swift\/swift-virtual\"<\/code><\/pre>\n<p>The resulting <code>registries.json<\/code> file will look like this:<\/p>\n<pre><code class=\"language-json\">{\n  \"authentication\": {},\n  \"registries\": {\n    \"[default]\": {\n      \"supportsAvailability\": false,\n      \"url\": \"https:\/\/packages.acme.com\/artifactory\/api\/swift\/swift-virtual\"\n    }\n  },\n  \"version\": 1\n}<\/code><\/pre>\n<p>To set the registry for all your projects, use the <code>--global<\/code> flag.<\/p>\n<pre><code class=\"language-bash\">swift package-registry set --global \"https:\/\/packages.acme.com\/artifactory\/api\/swift\/swift-virtual\"<\/code><\/pre>\n<p> This will create the configuration file at <code>~\/.swiftpm\/configuration\/registries.json<\/code>.<\/p>\n<p>Xcode projects don&#8217;t support project-level registries nor (in my experience) support scopes other than the default one (i.e. avoid using the <code>--scope<\/code> flag).<\/p>\n<h3 id=\"2-authentication\">2. Authentication<\/h3>\n<p>To pull packages, authenticating with Artifactory is usually required. It&#8217;s reasonable though that your company allows all artifacts from Artifactory to be read without authentication as long as one is connected to the company VPN.<\/p>\n<p>In cases where authentication is required, SPM uses a <code>.netrc<\/code> file in the home directory to find credentials for remote servers. This file is a standard way to handle login information for various network protocols.<\/p>\n<p>Using a token generated from the Artifactory dashboard, the line to add to the <code>.netrc<\/code> file would be:<\/p>\n<pre><code>machine packages.acme.com login &lt;your_artifactory_username&gt; password &lt;your_artifactory_token&gt;<\/code><\/pre>\n<p>Alternatively, it&#8217;s possible to log in using the <code>swift package-registry login<\/code> command. This command securely stores your token in the system&#8217;s keychain.<\/p>\n<pre><code>swift package-registry login \"https:\/\/packages.acme.com\/artifactory\/api\/swift\/swift-virtual\" \n  --token &lt;token&gt;\n\n# or\n\nswift package-registry login \"https:\/\/packages.acme.com\/artifactory\/api\/swift\/swift-virtual\" \n  --username &lt;username&gt; \n  --password &lt;token_treated_as_password&gt;<\/code><\/pre>\n<h2 id=\"cicd-setup\">CI\/CD Setup<\/h2>\n<p>On CI, the setup is slightly different as the goals are:<\/p>\n<ul>\n<li>to <em>resolve<\/em> dependencies in CI\/CD jobs<\/li>\n<li>to <em>publish<\/em> new package versions in CD jobs for both internal and external dependencies<\/li>\n<\/ul>\n<p>The steps described for the local setup are valid for the resolution on CI too. The interesting part here is how publishing is done. I will assume the usage of GitHub Actions.<\/p>\n<h3 id=\"1-retrieving-the-artifactory-token\">1. Retrieving the Artifactory Token<\/h3>\n<p>The JFrog CLI can be used via the <a href=\"https:\/\/github.com\/jfrog\/setup-jfrog-cli?ref=albertodebortoli.com\">setup-jfrog-cli<\/a> action to authenticate using the most appropriate method. You might want to wrap the action in a custom composable one exporting the token as the output of a step:<\/p>\n<pre><code>TOKEN=$(jf config export) \necho \"::add-mask::$TOKEN\"\necho \"artifactory-token=$TOKEN\"&gt;&gt; \"$GITHUB_OUTPUT\"<\/code><\/pre>\n<h3 id=\"2-logging-into-the-registry\">2. Logging into the Registry<\/h3>\n<p>The CI job must log in to the local repository (<code>swift-local<\/code>) to gain push permissions. The token retrieved in the previous step is used for this purpose.<\/p>\n<pre><code class=\"language-bash\">swift package-registry login \n  \"https:\/\/packages.acme.com\/artifactory\/api\/swift\/swift-local\" \n  --token ${{ steps.get-token.outputs.artifactory-token }}<\/code><\/pre>\n<h3 id=\"3-publishing-packages\">3. Publishing Packages<\/h3>\n<p>Swift Registry requires archives created with the <code>swift package archive-source<\/code> command from the dependency folder. E.g.<\/p>\n<pre><code class=\"language-bash\">swift package archive-source -o \"Alamofire-5.10.2.zip\"<\/code><\/pre>\n<p>We could avoid creating the archive and instead download it directly from GitHub releases.<\/p>\n<pre><code class=\"language-bash\">curl -L -o Alamofire-5.10.1.zip \n  https:\/\/github.com\/Alamofire\/Alamofire\/archive\/refs\/tags\/5.10.1.zip<\/code><\/pre>\n<p>Uploading the archive can then be done by using the JFrog CLI that needs customization via the <a href=\"https:\/\/github.com\/jfrog\/setup-jfrog-cli?ref=albertodebortoli.com\">setup-jfrog-cli<\/a> action. If going down this route, the upload command would be:<\/p>\n<pre><code class=\"language-bash\">jf rt upload Alamofire-5.10.1.zip \n  https:\/\/packages.acme.com\/artifactory\/api\/swift\/swift-local\/acme\/Alamofire\/Alamofire-5.10.1.zip<\/code><\/pre>\n<p>There is a <a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-artifactory-documentation\/swift-repository-structure?ref=albertodebortoli.com\">specific structure<\/a> to respect:<\/p>\n<pre><code>&lt;REPOSITORY&gt;\/&lt;SCOPE&gt;\/&lt;NAME&gt;\/&lt;NAME&gt;-&lt;VERSION&gt;.zip<\/code><\/pre>\n<p>which is the last part of the above URL:<\/p>\n<pre><code>swift-local\/acme\/Alamofire\/Alamofire-5.10.1.zip<\/code><\/pre>\n<p>Too bad that using the steps above causes a downstream problem with SPM not being able to resolve the dependencies in the registry. I tried extensively and couldn&#8217;t find the reason why SPM wouldn&#8217;t be happy with how the packages were published. I might have missed something but eventually I necessarily had to switch to use the <code>publish<\/code> command.<\/p>\n<p>Using the <code>swift package-registry publish<\/code> command instead, doesn&#8217;t present this issue hence it&#8217;s the solution adopted in this workflow.<\/p>\n<pre><code class=\"language-bash\">swift package-registry publish acme.Alamofire 5.10.1 \n  --url https:\/\/packages.acme.com\/artifactory\/api\/swift\/swift-local \n  --scratch-directory $(mktemp -d)<\/code><\/pre>\n<p>To verify the upload and indexing succeeded, check that the uploaded\u00a0<code>*.zip<\/code>\u00a0artifact is available and that the <code>.swift<\/code> exists (indication that the indexing has occurred). If the specific structure is not respected, the <code>.swift<\/code> folder wouldn&#8217;t be generated.<\/p>\n<h2 id=\"consuming-packages-from-the-registry\">Consuming Packages from the Registry<\/h2>\n<h3 id=\"packages\">Packages<\/h3>\n<p>The easiest and only documented way to consume a package from a registry is via a Package. In the <code>Package.swift<\/code> file, declare dependencies using the <code>.package(id:from:)<\/code> syntax to declare a registry-based dependency. The <code>id<\/code> is a combination of the scope and the package name.<\/p>\n<pre><code class=\"language-swift\">    ...\n    dependencies: [\n        .package(id: \"acme.Alamofire\", from: \"5.10.1\"),\n    ],\n    targets: [\n        .target(\n            name: \"MyApp\",\n            dependencies: [\n                .product(name: \"Alamofire\", package: \"acme.Alamofire\"),\n            ]\n        ),\n        ...\n    ]\n)\n<\/code><\/pre>\n<p>Run <code>swift package resolve<\/code> or simply build the Package in Xcode to pull the dependencies.<\/p>\n<p>You might bump into transitive dependencies (i.e. dependencies listed in the <code>Package.swift<\/code> files of the packages published on the registry) pointing to GitHub. In this case, it&#8217;d be great to instruct SPM to use the corresponding versions on the registry. The <code>--replace-scm-with-registry<\/code> flag is designed to work for the entire dependency graph, including transitive dependencies. <\/p>\n<p>The cornerstone of associating a registry-hosted package with its GitHub origin is the <code>package-metadata.json<\/code> file. This file allows to provide essential metadata about the packages at the time of publishing (the <code>--metadata-path<\/code> flag of the <code>publish<\/code> command defaults to <code>package-metadata.json<\/code>).<\/p>\n<p>Crucially, it includes a field to specify the source control repository URLs. When <code>swift package resolve --replace-scm-with-registry<\/code> is executed, SPM queries the configured registry. The registry then uses the information from the <code>package-metadata.json<\/code> to map the package identity to its corresponding GitHub URL, enabling a smooth and transparent resolution process.<\/p>\n<p>The metadata file must conform to the\u00a0<a href=\"https:\/\/github.com\/swiftlang\/swift-evolution\/blob\/main\/proposals\/0391-package-registry-publish.md?ref=albertodebortoli.com#package-release-metadata-standards\">JSON schema<\/a>\u00a0defined in <a href=\"https:\/\/github.com\/swiftlang\/swift-evolution\/blob\/main\/proposals\/0391-package-registry-publish.md?ref=albertodebortoli.com\" rel=\"noreferrer\">SE-0391<\/a>. It is recommended to include all URL variations (e.g., SSH, HTTPS) for the same repository.\u00a0E.g.<\/p>\n<pre><code class=\"language-json\">{\n  \"repositoryURLs\": [\n    \"https:\/\/github.com\/Alamofire\/Alamofire\",\n    \"https:\/\/github.com\/Alamofire\/Alamofire.git\",\n    \"git@github.com:Alamofire\/Alamofire.git\"\n  ]\n}<\/code><\/pre>\n<p>Printing the dependencies should confirm the source of the dependencies:<\/p>\n<pre><code class=\"language-bash\">swift package show-dependencies --replace-scm-with-registry<\/code><\/pre>\n<p>When loading a package with Xcode, the flag can be enabled via an environment variable in the scheme<\/p>\n<pre><code>IDEPackageDependencySCMToRegistryTransformation=useRegistryIdentityAndSources<\/code><\/pre>\n<p>Too bad that for packages, the schemes won&#8217;t load until SPM completes the resolution hence running the following from the terminal would address the issue:<\/p>\n<pre><code>defaults write com.apple.dt.Xcode IDEPackageDependencySCMToRegistryTransformation useRegistryIdentityAndSources<\/code><\/pre>\n<p>that can be unset with:<\/p>\n<pre><code>defaults delete com.apple.dt.Xcode IDEPackageDependencySCMToRegistryTransformation<\/code><\/pre>\n<h3 id=\"xcode\">Xcode<\/h3>\n<p>It&#8217;s likely that you&#8217;ll want to use the registry from Xcode projects for direct dependencies. If using the <a href=\"https:\/\/tuist.dev\/blog\/2025\/01\/22\/announcing-tuist-registry?ref=albertodebortoli.com\">Tuist registry<\/a>, it seems you would be able to leverage a Package Collection to add dependencies from the registry from the Xcode UI. Note that until Xcode 26 Beta 1, it&#8217;s not possible to add registry dependencies directly in the Xcode UI, but if you use Tuist to generate your project (as you should), you can use the <code>Package.registry<\/code> (introduced with <a href=\"https:\/\/github.com\/tuist\/tuist\/pull\/7225?ref=albertodebortoli.com\">https:\/\/github.com\/tuist\/tuist\/pull\/7225<\/a>). E.g.<\/p>\n<pre><code class=\"language-swift\">let project = Project(\n    ...\n    packages: [\n        .registry(\n            identifier: \"acme.Alamofire\",\n            requirement: .exact(Version(stringLiteral: \"5.10.1\"))\n        )\n    ],\n    ...\n)<\/code><\/pre>\n<p>If not using Tuist, you&#8217;d have to rely on setting <code>IDEPackageDependencySCMToRegistryTransformation<\/code> either as an environment variable in the scheme or globally via the terminal.<\/p>\n<p>You can also use <code>xcodebuild<\/code> to resolve dependencies using the correct flag:<\/p>\n<pre><code>xcodebuild \n  -resolvePackageDependencies \n  -packageDependencySCMToRegistryTransformation useRegistryIdentityAndSources<\/code><\/pre>\n<h2 id=\"conclusions\">Conclusions<\/h2>\n<p>We\u2019ve found that using an in-house Swift registry drastically reduces dependency resolution time and size on disk by downloading only the required revision instead of the entire, potentially large, Git repository. This improvement benefits both CI pipelines and developers\u2019 local environments. Additionally, registries help mitigate the risk of supply chain attacks.<\/p>\n<p>As of this writing, Swift registries are not widely adopted, which is reflected in the limited number of platforms that support them. It also shows <a href=\"https:\/\/forums.swift.org\/t\/package-registry-support-in-xcode\/73626?ref=albertodebortoli.com\">various<\/a> <a href=\"https:\/\/forums.swift.org\/t\/internal-error-uncaught-exception-when-building-swiftpm-project\/76237?ref=albertodebortoli.com\">bugs<\/a> I myself bumped into when using particular configurations.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2025\/06\/image.png?resize=1280%2C358&#038;ssl=1\" class=\"kg-image\" alt=\"How to setup a Swift Package Registry in Artifactory\" loading=\"lazy\" width=\"1280\" height=\"358\" srcset=\"https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/size\/w600\/2025\/06\/image.png 600w, https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/size\/w1000\/2025\/06\/image.png 1000w, https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2025\/06\/image.png 1300w\" sizes=\"auto, (min-width: 720px) 720px\"><figcaption><span style=\"white-space: pre-wrap;\">source: <\/span><a href=\"https:\/\/forums.swift.org\/t\/package-registry-support-in-xcode\/73626\/19?ref=albertodebortoli.com\"><span style=\"white-space: pre-wrap;\">https:\/\/forums.swift.org\/t\/package-registry-support-in-xcode\/73626\/19<\/span><\/a><\/figcaption><\/figure>\n<p>It&#8217;s unclear whether adoption will grow and uncertain if Apple will ever address the issues reported by the community, but when a functioning setup is put in place, registries offer an efficient and secure alternative to using XCFrameworks in production builds and reduce both memory and time footprints.<\/p>\n<\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_1891\" class=\"pvc_stats total_only  \" data-element-id=\"1891\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.0\" viewBox=\"0 0 502 315\" preserveAspectRatio=\"xMidYMid meet\"><g transform=\"translate(0,332) scale(0.1,-0.1)\" fill=\"\" stroke=\"none\"><path d=\"M2394 3279 l-29 -30 -3 -207 c-2 -182 0 -211 15 -242 39 -76 157 -76 196 0 15 31 17 60 15 243 l-3 209 -33 29 c-26 23 -41 29 -80 29 -41 0 -53 -5 -78 -31z\"\/><path d=\"M3085 3251 c-45 -19 -58 -50 -96 -229 -47 -217 -49 -260 -13 -295 52 -53 146 -42 177 20 16 31 87 366 87 410 0 70 -86 122 -155 94z\"\/><path d=\"M1751 3234 c-13 -9 -29 -31 -37 -50 -12 -29 -10 -49 21 -204 19 -94 39 -189 45 -210 14 -50 54 -80 110 -80 34 0 48 6 76 34 21 21 34 44 34 59 0 14 -18 113 -40 219 -37 178 -43 195 -70 221 -36 32 -101 37 -139 11z\"\/><path d=\"M1163 3073 c-36 -7 -73 -59 -73 -102 0 -56 133 -378 171 -413 34 -32 83 -37 129 -13 70 36 67 87 -16 290 -86 209 -89 214 -129 231 -35 14 -42 15 -82 7z\"\/><path d=\"M3689 3066 c-15 -9 -33 -30 -42 -48 -48 -103 -147 -355 -147 -375 0 -98 131 -148 192 -74 13 15 57 108 97 206 80 196 84 226 37 273 -30 30 -99 39 -137 18z\"\/><path d=\"M583 2784 c-38 -19 -67 -74 -58 -113 9 -42 211 -354 242 -373 16 -10 45 -18 66 -18 51 0 107 52 107 100 0 39 -1 41 -124 234 -80 126 -108 162 -133 173 -41 17 -61 16 -100 -3z\"\/><path d=\"M4250 2784 c-14 -9 -74 -91 -133 -183 -95 -150 -107 -173 -107 -213 0 -55 33 -94 87 -104 67 -13 90 8 211 198 130 202 137 225 78 284 -27 27 -42 34 -72 34 -22 0 -50 -8 -64 -16z\"\/><path d=\"M2275 2693 c-553 -48 -1095 -270 -1585 -649 -135 -104 -459 -423 -483 -476 -23 -49 -22 -139 2 -186 73 -142 361 -457 571 -626 285 -228 642 -407 990 -497 242 -63 336 -73 660 -74 310 0 370 5 595 52 535 111 1045 392 1455 803 122 121 250 273 275 326 19 41 19 137 0 174 -41 79 -309 363 -465 492 -447 370 -946 591 -1479 653 -113 14 -422 18 -536 8z m395 -428 c171 -34 330 -124 456 -258 112 -119 167 -219 211 -378 27 -96 24 -300 -5 -401 -72 -255 -236 -447 -474 -557 -132 -62 -201 -76 -368 -76 -167 0 -236 14 -368 76 -213 98 -373 271 -451 485 -162 444 86 934 547 1084 153 49 292 57 452 25z m909 -232 c222 -123 408 -262 593 -441 76 -74 138 -139 138 -144 0 -16 -233 -242 -330 -319 -155 -123 -309 -223 -461 -299 l-81 -41 32 46 c18 26 49 83 70 128 143 306 141 649 -6 957 -25 52 -61 116 -79 142 l-34 47 45 -20 c26 -10 76 -36 113 -56z m-2057 25 c-40 -58 -105 -190 -130 -263 -110 -324 -59 -707 132 -981 25 -35 42 -64 37 -64 -19 0 -241 119 -326 174 -188 122 -406 314 -532 468 l-58 71 108 103 c185 178 428 349 672 473 66 33 121 60 123 61 2 0 -10 -19 -26 -42z\"\/><path d=\"M2375 1950 c-198 -44 -350 -190 -395 -379 -18 -76 -8 -221 19 -290 114 -284 457 -406 731 -260 98 52 188 154 231 260 27 69 37 214 19 290 -38 163 -166 304 -326 360 -67 23 -215 33 -279 19z\"\/><\/g><\/svg><\/i> <img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/i0.wp.com\/dev95.site\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif?resize=16%2C16&#038;ssl=1\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Introduction It&#8217;s very difficult to have GenAI not hallucinate when in comes to Swift Package Registry. No surprise there: the feature is definitely niche, has not been vastly adopted and there&#8217;s a lack of examples online. As Dave put it,<\/p>\n<div class=\"hosteria-entry-more\"><a href=\"https:\/\/dev95.site\/ar\/how-to-setup-a-swift-package-registry-in-artifactory\/\" class=\"no-underline font-light  group-hover:text-primary-800 dark:group-hover:text-primary-300 py-1\">Read more &gt;&gt;&gt;<\/a><\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_1891\" class=\"pvc_stats total_only\" data-element-id=\"1891\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.0\" viewbox=\"0 0 502 315\" preserveaspectratio=\"xMidYMid meet\"><g transform=\"translate(0,332) scale(0.1,-0.1)\" fill=\"\" stroke=\"none\"><path d=\"M2394 3279 l-29 -30 -3 -207 c-2 -182 0 -211 15 -242 39 -76 157 -76 196 0 15 31 17 60 15 243 l-3 209 -33 29 c-26 23 -41 29 -80 29 -41 0 -53 -5 -78 -31z\"\/><path d=\"M3085 3251 c-45 -19 -58 -50 -96 -229 -47 -217 -49 -260 -13 -295 52 -53 146 -42 177 20 16 31 87 366 87 410 0 70 -86 122 -155 94z\"\/><path d=\"M1751 3234 c-13 -9 -29 -31 -37 -50 -12 -29 -10 -49 21 -204 19 -94 39 -189 45 -210 14 -50 54 -80 110 -80 34 0 48 6 76 34 21 21 34 44 34 59 0 14 -18 113 -40 219 -37 178 -43 195 -70 221 -36 32 -101 37 -139 11z\"\/><path d=\"M1163 3073 c-36 -7 -73 -59 -73 -102 0 -56 133 -378 171 -413 34 -32 83 -37 129 -13 70 36 67 87 -16 290 -86 209 -89 214 -129 231 -35 14 -42 15 -82 7z\"\/><path d=\"M3689 3066 c-15 -9 -33 -30 -42 -48 -48 -103 -147 -355 -147 -375 0 -98 131 -148 192 -74 13 15 57 108 97 206 80 196 84 226 37 273 -30 30 -99 39 -137 18z\"\/><path d=\"M583 2784 c-38 -19 -67 -74 -58 -113 9 -42 211 -354 242 -373 16 -10 45 -18 66 -18 51 0 107 52 107 100 0 39 -1 41 -124 234 -80 126 -108 162 -133 173 -41 17 -61 16 -100 -3z\"\/><path d=\"M4250 2784 c-14 -9 -74 -91 -133 -183 -95 -150 -107 -173 -107 -213 0 -55 33 -94 87 -104 67 -13 90 8 211 198 130 202 137 225 78 284 -27 27 -42 34 -72 34 -22 0 -50 -8 -64 -16z\"\/><path d=\"M2275 2693 c-553 -48 -1095 -270 -1585 -649 -135 -104 -459 -423 -483 -476 -23 -49 -22 -139 2 -186 73 -142 361 -457 571 -626 285 -228 642 -407 990 -497 242 -63 336 -73 660 -74 310 0 370 5 595 52 535 111 1045 392 1455 803 122 121 250 273 275 326 19 41 19 137 0 174 -41 79 -309 363 -465 492 -447 370 -946 591 -1479 653 -113 14 -422 18 -536 8z m395 -428 c171 -34 330 -124 456 -258 112 -119 167 -219 211 -378 27 -96 24 -300 -5 -401 -72 -255 -236 -447 -474 -557 -132 -62 -201 -76 -368 -76 -167 0 -236 14 -368 76 -213 98 -373 271 -451 485 -162 444 86 934 547 1084 153 49 292 57 452 25z m909 -232 c222 -123 408 -262 593 -441 76 -74 138 -139 138 -144 0 -16 -233 -242 -330 -319 -155 -123 -309 -223 -461 -299 l-81 -41 32 46 c18 26 49 83 70 128 143 306 141 649 -6 957 -25 52 -61 116 -79 142 l-34 47 45 -20 c26 -10 76 -36 113 -56z m-2057 25 c-40 -58 -105 -190 -130 -263 -110 -324 -59 -707 132 -981 25 -35 42 -64 37 -64 -19 0 -241 119 -326 174 -188 122 -406 314 -532 468 l-58 71 108 103 c185 178 428 349 672 473 66 33 121 60 123 61 2 0 -10 -19 -26 -42z\"\/><path d=\"M2375 1950 c-198 -44 -350 -190 -395 -379 -18 -76 -8 -221 19 -290 114 -284 457 -406 731 -260 98 52 188 154 231 260 27 69 37 214 19 290 -38 163 -166 304 -326 360 -67 23 -215 33 -279 19z\"\/><\/g><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/dev95.site\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=\"0\" \/><\/p>\n<div class=\"pvc_clear\"><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fp_fajr_begins":"","fp_fajr_iqamah":"","fp_dhuhr_begins":"","fp_dhuhr_iqamah":"","fp_asr_begins":"","fp_asr_iqamah":"","fp_maghrib_begins":"","fp_maghrib_iqamah":"","fp_isha_begins":"","fp_isha_iqamah":"","fp_midnight":"","fp_midnight_name":"","fp_sunrise":"","fp_single_prayer_begins_title":"","fp_single_prayer_iqamah_title":"","fp_prayer_times_for_today":"","fp_hijra_date":"","fp_fajr_name":"","fp_dhuhr_name":"","fp_asr_name":"","fp_maghrib_name":"","fp_isha_name":"","fp_sunrise_name":"","fp_currentDate":"","fp_current_time":"","fp_current_title":"","fp_current_location":"","fp_masjid_name":"","fp_prayer_title":"","fp_next_prayer_iqamah_time":"","fp_next_prayer_iqamah_title":"","fp_next_prayer_begins_time":"","fp_next_prayer_begins_title":"","fp_next_prayer_title":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[37],"tags":[],"class_list":["post-1891","post","type-post","status-publish","format-standard","hentry","category-posts"],"a3_pvc":{"activated":true,"total_views":0,"today_views":0},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to setup a Swift Package Registry in Artifactory - Dev95<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dev95.site\/ar\/how-to-setup-a-swift-package-registry-in-artifactory\/\" \/>\n<meta property=\"og:locale\" content=\"ar_AR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to setup a Swift Package Registry in Artifactory - Dev95\" \/>\n<meta property=\"og:description\" content=\"Introduction It&#8217;s very difficult to have GenAI not hallucinate when in comes to Swift Package Registry. No surprise there: the feature is definitely niche, has not been vastly adopted and there&#8217;s a lack of examples online. As Dave put it,Read more &gt;&gt;&gt;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dev95.site\/ar\/how-to-setup-a-swift-package-registry-in-artifactory\/\" \/>\n<meta property=\"og:site_name\" content=\"Dev95\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-06T08:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2025\/06\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg\" \/>\n<meta name=\"author\" content=\"dev95\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u0643\u064f\u062a\u0628 \u0628\u0648\u0627\u0633\u0637\u0629\" \/>\n\t<meta name=\"twitter:data1\" content=\"dev95\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u0648\u0642\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u064f\u0642\u062f\u0651\u0631\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 \u062f\u0642\u064a\u0642\u0629\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/\"},\"author\":{\"name\":\"dev95\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/person\\\/b807805ffe2916206b04d0938bce0298\"},\"headline\":\"How to setup a Swift Package Registry in Artifactory\",\"datePublished\":\"2025-06-06T08:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/\"},\"wordCount\":1845,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/storage.ghost.io\\\/c\\\/ae\\\/f4\\\/aef4d625-32a2-417b-86f4-22c70a9b47a1\\\/content\\\/images\\\/2025\\\/06\\\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg\",\"articleSection\":[\"Posts\"],\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/\",\"url\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/\",\"name\":\"How to setup a Swift Package Registry in Artifactory - Dev95\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/storage.ghost.io\\\/c\\\/ae\\\/f4\\\/aef4d625-32a2-417b-86f4-22c70a9b47a1\\\/content\\\/images\\\/2025\\\/06\\\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg\",\"datePublished\":\"2025-06-06T08:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/#breadcrumb\"},\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/#primaryimage\",\"url\":\"https:\\\/\\\/storage.ghost.io\\\/c\\\/ae\\\/f4\\\/aef4d625-32a2-417b-86f4-22c70a9b47a1\\\/content\\\/images\\\/2025\\\/06\\\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg\",\"contentUrl\":\"https:\\\/\\\/storage.ghost.io\\\/c\\\/ae\\\/f4\\\/aef4d625-32a2-417b-86f4-22c70a9b47a1\\\/content\\\/images\\\/2025\\\/06\\\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dev95.site\\\/how-to-setup-a-swift-package-registry-in-artifactory\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dev95.site\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to setup a Swift Package Registry in Artifactory\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#website\",\"url\":\"https:\\\/\\\/dev95.site\\\/\",\"name\":\"Dev95\",\"description\":\"A comprehensive platform for data and knowledge, delivering reliable content that meets the aspirations of readers and enthusiasts.\",\"publisher\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dev95.site\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ar\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\",\"name\":\"Dev95\",\"url\":\"https:\\\/\\\/dev95.site\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/rbrrbr-6.png?fit=512%2C512&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/rbrrbr-6.png?fit=512%2C512&ssl=1\",\"width\":512,\"height\":512,\"caption\":\"Dev95\"},\"image\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/person\\\/b807805ffe2916206b04d0938bce0298\",\"name\":\"dev95\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"caption\":\"dev95\"},\"url\":\"https:\\\/\\\/dev95.site\\\/ar\\\/author\\\/mohammad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to setup a Swift Package Registry in Artifactory - Dev95","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dev95.site\/ar\/how-to-setup-a-swift-package-registry-in-artifactory\/","og_locale":"ar_AR","og_type":"article","og_title":"How to setup a Swift Package Registry in Artifactory - Dev95","og_description":"Introduction It&#8217;s very difficult to have GenAI not hallucinate when in comes to Swift Package Registry. No surprise there: the feature is definitely niche, has not been vastly adopted and there&#8217;s a lack of examples online. As Dave put it,Read more &gt;&gt;&gt;","og_url":"https:\/\/dev95.site\/ar\/how-to-setup-a-swift-package-registry-in-artifactory\/","og_site_name":"Dev95","article_published_time":"2025-06-06T08:00:00+00:00","og_image":[{"url":"https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2025\/06\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg","type":"","width":"","height":""}],"author":"dev95","twitter_card":"summary_large_image","twitter_misc":{"\u0643\u064f\u062a\u0628 \u0628\u0648\u0627\u0633\u0637\u0629":"dev95","\u0648\u0642\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u064f\u0642\u062f\u0651\u0631":"11 \u062f\u0642\u064a\u0642\u0629"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/#article","isPartOf":{"@id":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/"},"author":{"name":"dev95","@id":"https:\/\/dev95.site\/#\/schema\/person\/b807805ffe2916206b04d0938bce0298"},"headline":"How to setup a Swift Package Registry in Artifactory","datePublished":"2025-06-06T08:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/"},"wordCount":1845,"commentCount":0,"publisher":{"@id":"https:\/\/dev95.site\/#organization"},"image":{"@id":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/#primaryimage"},"thumbnailUrl":"https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2025\/06\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg","articleSection":["Posts"],"inLanguage":"ar","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/","url":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/","name":"How to setup a Swift Package Registry in Artifactory - Dev95","isPartOf":{"@id":"https:\/\/dev95.site\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/#primaryimage"},"image":{"@id":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/#primaryimage"},"thumbnailUrl":"https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2025\/06\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg","datePublished":"2025-06-06T08:00:00+00:00","breadcrumb":{"@id":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/#breadcrumb"},"inLanguage":"ar","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/"]}]},{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/#primaryimage","url":"https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2025\/06\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg","contentUrl":"https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2025\/06\/Gemini_Generated_Image_p2p1t1p2p1t1p2p1.jpeg"},{"@type":"BreadcrumbList","@id":"https:\/\/dev95.site\/how-to-setup-a-swift-package-registry-in-artifactory\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/dev95.site\/"},{"@type":"ListItem","position":2,"name":"How to setup a Swift Package Registry in Artifactory"}]},{"@type":"WebSite","@id":"https:\/\/dev95.site\/#website","url":"https:\/\/dev95.site\/","name":"Dev95","description":"A comprehensive platform for data and knowledge, delivering reliable content that meets the aspirations of readers and enthusiasts.","publisher":{"@id":"https:\/\/dev95.site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dev95.site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ar"},{"@type":"Organization","@id":"https:\/\/dev95.site\/#organization","name":"Dev95","url":"https:\/\/dev95.site\/","logo":{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/dev95.site\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/07\/rbrrbr-6.png?fit=512%2C512&ssl=1","contentUrl":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/07\/rbrrbr-6.png?fit=512%2C512&ssl=1","width":512,"height":512,"caption":"Dev95"},"image":{"@id":"https:\/\/dev95.site\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/dev95.site\/#\/schema\/person\/b807805ffe2916206b04d0938bce0298","name":"dev95","image":{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","caption":"dev95"},"url":"https:\/\/dev95.site\/ar\/author\/mohammad\/"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts\/1891","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/comments?post=1891"}],"version-history":[{"count":0,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts\/1891\/revisions"}],"wp:attachment":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/media?parent=1891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/categories?post=1891"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/tags?post=1891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}