

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# CodeArtifact 与 Swift 配
<a name="using-swift"></a>

这些主题描述了如何使用 Swift Package Manager CodeArtifact 来安装和发布 Swift 软件包。

**注意**  
CodeArtifact 支持 Swift 5.8 及更高版本以及 Xcode 14.3 及更高版本。  
CodeArtifact 推荐 Swift 5.9 及更高版本以及 Xcode 15 及更高版本。

**Topics**
+ [配置 Swift CodeArtifact](configure-swift.md)
+ [使用和发布 Swift 程序包](swift-publish-consume.md)
+ [Swift 程序包名称和命名空间规范化](swift-name-normalization.md)
+ [Swift 故障排除](swift-troubleshooting.md)

# 配置 Swift Package Manager CodeArtifact
<a name="configure-swift"></a>

要使用 Swift Package Manager 向仓库发布软件包或使用其中的软件包 AWS CodeArtifact，你首先需要设置访问 CodeArtifact 仓库的凭证。使用您的 CodeArtifact 凭据和存储库端点配置 Swift Package Manager CLI 的推荐方法是使用`aws codeartifact login`命令。您也可以手动配置 Swift 程序包管理器。

## 使用 login 命令配置 Swift
<a name="configure-swift-login-command"></a>

使用`aws codeartifact login`命令配置 Swift Package Manager CodeArtifact。

**注意**  
要使用 login 命令，需要使用 Swift 5.8 或更高版本，建议使用 Swift 5.9 或更高版本。

`aws codeartifact login` 命令将执行以下操作：

1. 从中获取身份验证令牌 CodeArtifact 并将其存储在您的环境中。凭证的存储方式取决于环境的操作系统：

   1. **macOS：**在 macOS 钥匙串应用程序中创建一个条目。

   1. **Linux 和 Windows：**在 `~/.netrc` 文件中创建一个条目。

   在所有操作系统中，如果存在凭证条目，则此命令会用新令牌替换该条目。

1. 获取您的 CodeArtifact 存储库端点 URL 并将其添加到 Swift 配置文件中。该命令将存储库端点 URL 添加到位于 `/path/to/project/.swiftpm/configuration/registries.json` 的项目级配置文件中。

**注意**  
`aws codeartifact login` 命令会调用 `swift package-registry` 命令，后面的命令必须从包含 `Package.swift` 文件的目录中运行。因此，`aws codeartifact login` 命令必须在 Swift 项目中运行。

**使用 login 命令配置 Swift**

1. 导航到包含项目 `Package.swift` 文件的 Swift 项目目录。

1. 运行以下 `aws codeartifact login` 命令：

   如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。

   ```
   aws codeartifact login --tool swift --domain my_domain \
   --domain-owner 111122223333 --repository my_repo \
   [--namespace my_namespace]
   ```

该`--namespace`选项将应用程序配置为仅使用存储 CodeArtifact 库中位于指定命名空间中的软件包。 [CodeArtifact 命名空间](codeartifact-concepts.md#welcome-concepts-package-namespace)是作用域的同义词，用于将代码组织成逻辑组，并防止在代码库包含多个库时可能发生的名称冲突。

调用 `login` 后的默认授权期为 12 小时，且必须调用 `login` 来定期刷新令牌。有关使用 `login` 命令创建的授权令牌的更多信息，请参阅[使用 `login` 命令创建的令牌](tokens-authentication.md#auth-token-login)。

## 不使用 login 命令配置 Swift
<a name="configure-swift-without-login-command"></a>

虽然建议您[使用 `aws codeartifact login` 命令来配置 Swift](#configure-swift-login-command)，但您也可以通过手动更新 Swift 程序包管理器配置来配置 Swift 程序包管理器，而不使用 login 命令。

在以下步骤中，您将使用 AWS CLI 来执行以下操作：

1. 从中获取身份验证令牌 CodeArtifact 并将其存储在您的环境中。凭证的存储方式取决于环境的操作系统：

   1. **macOS：**在 macOS 钥匙串应用程序中创建一个条目。

   1. **Linux 和 Windows：**在 `~/.netrc` 文件中创建一个条目。

1. 获取您的 CodeArtifact 存储库终端节点 URL。

1. 在 `~/.swiftpm/configuration/registries.json` 配置文件中，添加一个包含存储库端点 URL 和身份验证类型的条目。

**不使用 login 命令配置 Swift**

1. 在命令行中，使用以下命令获取 CodeArtifact 授权令牌并将其存储在环境变量中。
   + *my\$1domain*用您的 CodeArtifact 域名替换。
   + *111122223333*替换为域名所有者的 AWS 账户 ID。如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。

------
#### [ macOS and Linux ]

   ```
   export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text`
   ```

------
#### [ Windows ]
   + Windows（使用默认命令 shell）：

     ```
     for /f %i in ('aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text') do set CODEARTIFACT_AUTH_TOKEN=%i
     ```
   + 窗户 PowerShell：

     ```
     $env:CODEARTIFACT_AUTH_TOKEN = aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text
     ```

------

1. 运行以下命令获取 CodeArtifact 仓库的终端节点。您的存储库端点用于将 Swift 程序包管理器指向您的存储库来使用或发布程序包。
   + *my\$1domain*用您的 CodeArtifact 域名替换。
   + *111122223333*替换为域名所有者的 AWS 账户 ID。如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。
   + *my\$1repo*替换为您的 CodeArtifact 存储库名称。

------
#### [ macOS and Linux ]

   ```
   export CODEARTIFACT_REPO=`aws codeartifact get-repository-endpoint --domain my_domain --domain-owner 111122223333 --repository my_repo --format swift --query repositoryEndpoint --output text`
   ```

------
#### [ Windows ]
   + Windows（使用默认命令 shell）：

     ```
     for /f %i in ('aws codeartifact get-repository-endpoint --domain my_domain --domain-owner 111122223333 --repository my_repo --format swift --query repositoryEndpoint --output text') do set CODEARTIFACT_REPO=%i
     ```
   + 窗户 PowerShell：

     ```
     $env:CODEARTIFACT_REPO = aws codeartifact get-repository-endpoint --domain my_domain --domain-owner 111122223333 --repository my_repo --format swift --query repositoryEndpoint --output text
     ```

------

   以下 URL 是一个示例存储库端点。

   ```
   https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/swift/my_repo/
   ```
**注意**  
要使用双堆栈端点，请使用 `codeartifact.region.on.aws` 端点。
**重要**  
当用于配置 Swift 程序包管理器时，必须将 `login` 附加到存储库 URL 端点的末尾。在此程序的命令中为您完成附加。

1. 将这两个值存储在环境变量中之后，使用 `swift package-registry login` 命令将它们传递给 Swift，如下所示：

------
#### [ macOS and Linux ]

   ```
   swift package-registry login ${CODEARTIFACT_REPO}login --token ${CODEARTIFACT_AUTH_TOKEN}
   ```

------
#### [ Windows ]
   + Windows（使用默认命令 shell）：

     ```
     swift package-registry login %CODEARTIFACT_REPO%login --token %CODEARTIFACT_AUTH_TOKEN%
     ```
   + 窗户 PowerShell：

     ```
     swift package-registry login $Env:CODEARTIFACT_REPO+"login" --token $Env:CODEARTIFACT_AUTH_TOKEN
     ```

------

1. 接下来，更新应用程序使用的软件包注册表，以便从您的 CodeArtifact 存储库中提取任何依赖项。必须在您尝试解析程序包依赖项所在的项目目录中运行此命令：

------
#### [ macOS and Linux ]

   ```
   $ swift package-registry set ${CODEARTIFACT_REPO} [--scope my_scope]
   ```

------
#### [ Windows ]
   + Windows（使用默认命令 shell）：

     ```
     $ swift package-registry set %CODEARTIFACT_REPO% [--scope my_scope]
     ```
   + 窗户 PowerShell：

     ```
     $ swift package-registry set $Env:CODEARTIFACT_REPO [--scope my_scope]
     ```

------

   该`--scope`选项将应用程序配置为仅在指定范围内使用存储 CodeArtifact 库中的软件包。作用域是[CodeArtifact 命名空间](codeartifact-concepts.md#welcome-concepts-package-namespace)的同义词，用于将代码组织成逻辑组，并防止代码库包含多个库时可能发生的名称冲突。

1. 通过在项目目录中运行以下命令，可以查看项目级 `.swiftpm/configuration/registries.json` 文件的内容，从而确认已正确设置配置：

   ```
   $ cat .swiftpm/configuration/registries.json
   {
     "authentication" : {
   
     },
     "registries" : {
       "[default]" : {
         "url" : "https://my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/swift/my-repo/"
       }
     },
     "version" : 1
   }
   ```

现在，你已经为 CodeArtifact 仓库配置了 Swift Package Manager，你可以用它来发布和使用 Swift 软件包和从中使用 Swift 包。有关更多信息，请参阅 [使用和发布 Swift 程序包](swift-publish-consume.md)。

# 使用和发布 Swift 程序包
<a name="swift-publish-consume"></a>

## 使用来自的 Swift 包 CodeArtifact
<a name="consume-swift-packages"></a>

使用以下过程使用 AWS CodeArtifact 存储库中的 Swift 软件包。

**使用 CodeArtifact 存储库中的 Swift 软件包**

1. 如果还没有，请按照中的[配置 Swift Package Manager CodeArtifact](configure-swift.md)步骤将 Swift Package Manager 配置为使用具有正确凭据的 CodeArtifact 存储库。
**注意**  
生成的授权令牌有效期为 12 小时。如果自创建令牌以来已过去 12 小时，则需要创建一个新的令牌。

1. 编辑应用程序项目文件夹中的 `Package.swift` 文件来更新项目要使用的程序包依赖项。

   1. 如果 `Package.swift` 文件不包含任何 `dependencies` 部分，请添加这个部分。

   1. 在 `Package.swift` 文件的 `dependencies` 部分，通过添加程序包标识符来添加要使用的程序包。程序包标识符包含作用域和程序包名称，中间用句点分隔。有关示例，请参阅后续步骤之后的代码段。
**提示**  
要查找软件包标识符，您可以使用 CodeArtifact 控制台。找到要使用的特定程序包版本，并参考程序包版本页面上的**安装快捷方式**说明。

   1. 如果 `Package.swift` 文件不包含任何 `targets` 部分，请添加这个部分。

   1. 在 `targets` 部分中，添加需要使用依赖项的目标。

      以下代码段是一个示例代码段，显示了 `Package.swift` 文件中已配置的 `dependencies` 和 `targets` 部分：

      ```
      ...
          ],
          dependencies: [
              .package(id: "my_scope.package_name", from: "1.0.0")
          ],
          targets: [
            .target(
               name: "MyApp",
               dependencies: ["package_name"]
            ),...
          ],
      ...
      ```

1. 现在，所有内容都已配置完毕，请使用以下命令从中下载软件包依赖关系 CodeArtifact。

   ```
   swift package resolve
   ```

## 使用 Xcode CodeArtifact 中的 Swift 软件包
<a name="consume-swift-packages-xcode"></a>

使用以下过程在 Xcode 中使用 CodeArtifact 存储库中的 Swift 软件包。

**在 Xcode 中使用 CodeArtifact 存储库中的 Swift 软件包**

1. 如果还没有，请按照中的[配置 Swift Package Manager CodeArtifact](configure-swift.md)步骤将 Swift Package Manager 配置为使用具有正确凭据的 CodeArtifact 存储库。
**注意**  
生成的授权令牌有效期为 12 小时。如果自创建令牌以来已过去 12 小时，则需要创建一个新的令牌。

1. 在 Xcode 中将这些程序包作为依赖项添加到项目中。

   1. 选择**文件 > 添加程序包**。

   1. 使用搜索栏来搜索程序包。搜索必须采用 `package_scope.package_name` 形式。

   1. 找到程序包后，选择程序包并选择**添加程序包**。

   1. 验证程序包后，选择要添加为依赖项的程序包产品，然后选择**添加程序包**。

如果您在 Xcode 中使用存储 CodeArtifact 库时遇到问题，[Swift 故障排除](swift-troubleshooting.md)请参阅，了解常见问题和可能的修复方法。

## 将 Swift 包发布到 CodeArtifact
<a name="publish-swift-packages"></a>

CodeArtifact 推荐 Swift 5.9 或更高版本，并使用`swift package-registry publish`命令发布 Swift 软件包。如果您使用的是早期版本，则必须使用 Curl 命令将 Swift 软件包发布到 CodeArtifact。

### 使用`swift package-registry publish`命令发布 CodeArtifact 软件包
<a name="publish-swift-packages-publish-command"></a>

在 Swift 5.9 或更高版本中使用以下过程使用 Swift Package Manager 将 Swift 软件包发布到 CodeArtifact 存储库。

1. 如果还没有，请按照中的[配置 Swift Package Manager CodeArtifact](configure-swift.md)步骤将 Swift Package Manager 配置为使用具有正确凭据的 CodeArtifact 存储库。
**注意**  
生成的授权令牌有效期为 12 小时。如果自创建令牌以来已过去 12 小时，则需要创建一个新的令牌。

1. 导航到包含程序包的 `Package.swift` 文件的 Swift 项目目录。

1. 运行以下 `swift package-registry publish` 命令来发布程序包。该命令创建软件包源存档并将其发布到您的 CodeArtifact 存储库。

   ```
   swift package-registry publish packageScope.packageName packageVersion
   ```

   例如：

   ```
   swift package-registry publish myScope.myPackage 1.0.0
   ```

1. 您可以通过在控制台中检查或按如下所示使用 `aws codeartifact list-packages` 命令来确认已发布程序包并存在于存储库中：

   ```
   aws codeartifact list-packages --domain my_domain --repository my_repo
   ```

   您可以按如下所示使用 `aws codeartifact list-package-versions` 命令来列出程序包的单个版本：

   ```
   aws codeartifact list-package-versions --domain my_domain --repository my_repo \
   --format swift --namespace my_scope --package package_name
   ```

### 使用 Cur CodeArtifact l 发布软件包
<a name="publish-swift-packages-curl"></a>

虽然建议使用 Swift 5.9 或更高版本附带的`swift package-registry publish`命令，但你也可以使用 Curl 将 Swift 软件包发布到。 CodeArtifact

使用以下过程使用 Curl 将 Swift 软件包发布到 AWS CodeArtifact 存储库。

1. 如果还没有创建和更新环境变量，请按照[配置 Swift Package Manager CodeArtifact](configure-swift.md)中的步骤创建和更新 `CODEARTIFACT_AUTH_TOKEN` 和 `CODEARTIFACT_REPO` 环境变量。
**注意**  
授权令牌有效期为 12 小时。如果 `CODEARTIFACT_AUTH_TOKEN` 环境变量自创建以来已过去 12 小时，则需要使用新的凭证刷新环境变量。

1. 首先，如果您没有创建 Swift 程序包，则可以通过运行以下命令来创建：

   ```
   mkdir testDir && cd testDir
   swift package init
   git init .
   swift package archive-source
   ```

1. 使用以下 Curl 命令将你的 Swift 软件包发布到 CodeArtifact：

------
#### [ macOS and Linux ]

   ```
   curl -X PUT  --user "aws:$CODEARTIFACT_AUTH_TOKEN" \
   -H "Accept: application/vnd.swift.registry.v1+json" \
   -F source-archive="@test_dir_package_name.zip" \
   "${CODEARTIFACT_REPO}my_scope/package_name/packageVersion"
   ```

------
#### [ Windows ]

   ```
   curl -X PUT  --user "aws:%CODEARTIFACT_AUTH_TOKEN%" \
   -H "Accept: application/vnd.swift.registry.v1+json" \
   -F source-archive="@test_dir_package_name.zip" \
   "%CODEARTIFACT_REPO%my_scope/package_name/packageVersion"
   ```

------

1. 您可以通过在控制台中检查或按如下所示使用 `aws codeartifact list-packages` 命令来确认已发布程序包并存在于存储库中：

   ```
   aws codeartifact list-packages --domain my_domain --repository my_repo
   ```

   您可以按如下所示使用 `aws codeartifact list-package-versions` 命令来列出程序包的单个版本：

   ```
   aws codeartifact list-package-versions --domain my_domain --repository my_repo \
   --format swift --namespace my_scope --package package_name
   ```

## 从中获取 Swift 软件包 GitHub 并重新发布到 CodeArtifact
<a name="publish-swift-packages-from-github"></a>

使用以下过程从中获取 Swift 软件包 GitHub 并将其重新发布到 CodeArtifact 存储库。

**从中获取 Swift 软件包 GitHub 并将其重新发布到 CodeArtifact**

1. 如果还没有，请按照中的[配置 Swift Package Manager CodeArtifact](configure-swift.md)步骤将 Swift Package Manager 配置为使用具有正确凭据的 CodeArtifact 存储库。
**注意**  
生成的授权令牌有效期为 12 小时。如果自创建令牌以来已过去 12 小时，则需要创建一个新的令牌。

1. 使用以下 `git clone` 命令克隆要提取并重新发布的 Swift 程序包的 Git 存储库。有关克隆 GitHub 仓库的信息，请参阅 GitHub 文档[中的克隆仓库](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)。

   ```
   git clone repoURL
   ```

1. 导航到您刚刚克隆的存储库：

   ```
   cd repoName
   ```

1. 创建软件包并将其发布到 CodeArtifact。

   1. **推荐：**如果您使用的是 Swift 5.9 或更高版本，则可以使用以下`swift package-registry publish`命令创建软件包并将其发布到您配置的 CodeArtifact 存储库中。

      ```
      swift package-registry publish packageScope.packageName versionNumber
      ```

      例如：

      ```
      swift package-registry publish myScope.myPackage 1.0.0
      ```

   1. 如果您使用的 Swift 版本早于 5.9，则必须使用 `swift archive-source` 命令创建程序包，然后使用 Curl 命令来发布程序包。

      1. 如果您尚未配置 `CODEARTIFACT_AUTH_TOKEN` 和 `CODEARTIFACT_REPO` 环境变量，或者自配置以来已过去 12 小时，请按照[不使用 login 命令配置 Swift](configure-swift.md#configure-swift-without-login-command)中的步骤进行操作。

      1. 使用 `swift package archive-source` 命令创建 Swift 程序包：

         ```
         swift package archive-source
         ```

         如果成功，您会在命令行中看到 `Created package_name.zip`。

      1. 使用以下 Curl 命令将 Swift 软件包发布到 CodeArtifact：

------
#### [ macOS and Linux ]

         ```
         curl -X PUT  --user "aws:$CODEARTIFACT_AUTH_TOKEN" \
         -H "Accept: application/vnd.swift.registry.v1+json" \
         -F source-archive="@package_name.zip" \
         "${CODEARTIFACT_REPO}my_scope/package_name/packageVersion"
         ```

------
#### [ Windows ]

         ```
         curl -X PUT  --user "aws:%CODEARTIFACT_AUTH_TOKEN%" \
         -H "Accept: application/vnd.swift.registry.v1+json" \
         -F source-archive="@package_name.zip" \
         "%CODEARTIFACT_REPO%my_scope/package_name/packageVersion"
         ```

------

1. 您可以通过在控制台中检查或按如下所示使用 `aws codeartifact list-packages` 命令来确认已发布程序包并存在于存储库中：

   ```
   aws codeartifact list-packages --domain my_domain --repository my_repo
   ```

   您可以按如下所示使用 `aws codeartifact list-package-versions` 命令来列出程序包的单个版本：

   ```
   aws codeartifact list-package-versions --domain my_domain --repository my_repo \
   --format swift --namespace my_scope --package package_name
   ```

# Swift 程序包名称和命名空间规范化
<a name="swift-name-normalization"></a>

CodeArtifact 在存储软件包名称和命名空间之前对其进行标准化，这意味着中的名称 CodeArtifact 可能与发布软件包时提供的名称不同。

Pac@@ **kage 名称和命名空间标准化：**通过将所有字母转换为小写来 CodeArtifact 规范化 Swift 软件包名称和命名空间。

**Package 版本标准化：** CodeArtifact 不对 Swift 包版本进行标准化。[请注意， CodeArtifact 仅支持语义版本控制 2.0 版本模式，有关语义版本控制的更多信息，请参阅语义版本控制 2.0.0。](https://semver.org/spec/v2.0.0.html)

非标准化包名和命名空间可用于 API 和 CLI 请求，因为 CodeArtifact 会对这些请求的输入进行标准化。例如，`--package myPackage` 和 `--namespace myScope` 的输入会规范化，并返回一个使用规范化程序包名称 `mypackage` 和命名空间 `myscope` 的程序包。

**您必须在中使用标准化名称 ARNs，例如在 IAM 策略中。**

要查找程序包的规范化名称，请使用 `aws codeartifact list-packages` 命令。有关更多信息，请参阅 [列出程序包名称](list-packages.md)。

# Swift 故障排除
<a name="swift-troubleshooting"></a>

以下信息可能有助于你解决 Swift 和的常见问题 CodeArtifact。

## 即使在配置了 Swift 程序包管理器之后，我在 Xcode 中还是出现了 401 错误
<a name="swift-troubleshooting-xcode"></a>

**问题：**当你尝试将 CodeArtifact 仓库中的软件包作为依赖项添加到 Xcode 中的 Swift 项目时，即使你按照[连接到 Swift 的说明进行操作，也会收到 CodeArtifact](configure-swift.md) 401 未经授权的错误。

**可能的修复方法：**这可能是由存储您的 CodeArtifact 凭据的 macOS 钥匙串应用程序存在问题引起的。要解决这个问题，我们建议打开 Keychain 应用程序并删除所有 CodeArtifact 条目，然后按照中的说明再次使用 CodeArtifact 存储库配置 Swift Package Manager。[配置 Swift Package Manager CodeArtifact](configure-swift.md)

## 由于钥匙串提示输入密码，Xcode 在 CI 计算机上挂起
<a name="swift-troubleshooting-ci-machine"></a>

**问题：**当你尝试从 CodeArtifact 持续集成 (CI) 服务器上的 Xcode 版本中提取 Swift 包时，例如使用 GitHub Actions，身份验证 CodeArtifact 可能会挂起并最终失败，并显示类似于以下内容的错误消息：

`Failed to save credentials for \'https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com\' to keychain: status -60008`

**可能的解决方法：**这是因为未将凭证保存到 CI 计算机上的钥匙串中，而 Xcode 仅支持保存在钥匙串中的凭证。要解决这个问题，建议使用以下步骤手动创建钥匙串条目：

1. 准备钥匙串。

   ```
   KEYCHAIN_PASSWORD=$(openssl rand -base64 20)
   KEYCHAIN_NAME=login.keychain
   SYSTEM_KEYCHAIN=/Library/Keychains/System.keychain
   
   if [ -f $HOME/Library/Keychains/"${KEYCHAIN_NAME}"-db ]; then
       echo "Deleting old ${KEYCHAIN_NAME} keychain"
       security delete-keychain "${KEYCHAIN_NAME}"
   fi
   echo "Create Keychain"
   security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
   
   EXISTING_KEYCHAINS=( $( security list-keychains | sed -e 's/ *//' | tr '\n' ' ' | tr -d '"') )
   sudo security list-keychains -s "${KEYCHAIN_NAME}" "${EXISTING_KEYCHAINS[@]}"
   
   echo "New keychain search list :"
   security list-keychain 
   
   echo "Configure keychain : remove lock timeout"
   security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
   security set-keychain-settings "${KEYCHAIN_NAME}"
   ```

1. 获取 CodeArtifact 身份验证令牌和您的存储库端点。

   ```
   export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token \
                                       --region us-west-2 \
                                       --domain my_domain   \
                                       --domain-owner 111122223333   \
                                       --query authorizationToken  \
                                       --output text`
                                        
   export CODEARTIFACT_REPO=`aws codeartifact get-repository-endpoint  \
                                 --region us-west-2   \
                                 --domain my_domain   \
                                 --domain-owner 111122223333   \
                                 --format swift     \
                                 --repository my_repo    \
                                 --query repositoryEndpoint   \
                                 --output text`
   ```

1. 手动创建钥匙串条目。

   ```
   SERVER=$(echo $CODEARTIFACT_REPO | sed  's/https:\/\///g' | sed 's/.com.*$/.com/g')
   AUTHORIZATION=(-T /usr/bin/security -T /usr/bin/codesign -T /usr/bin/xcodebuild -T /usr/bin/swift \
                  -T /Applications/Xcode-15.2.app/Contents/Developer/usr/bin/xcodebuild)
   
   security delete-internet-password -a token -s $SERVER -r htps "${KEYCHAIN_NAME}"
   
   security add-internet-password -a token \
                                  -s $SERVER \
                                  -w $CODEARTIFACT_AUTH_TOKEN \
                                  -r htps \
                                  -U \
                                  "${AUTHORIZATION[@]}" \
                                  "${KEYCHAIN_NAME}"
   
   security set-internet-password-partition-list \
                -a token \
                -s $SERVER \
                -S "com.apple.swift-package,com.apple.security,com.apple.dt.Xcode,apple-tool:,apple:,codesign" \
                -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
   
   security find-internet-password   "${KEYCHAIN_NAME}"
   ```

有关此错误和解决方案的更多信息，请参阅 [https://github.com/apple/swift-package-manager/issues/7236](https://github.com/apple/swift-package-manager/issues/7236)。