

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# CodeArtifact를 Swift와 함께 사용
<a name="using-swift"></a>

이 항목에서는 CodeArtifact와 함께 Swift 패키지 관리자를 사용하여 Swift 패키지를 설치하고 게시하는 방법을 설명합니다.

**참고**  
CodeArtifact는 Swift 5.8 이상 및 Xcode 14.3 이상을 지원합니다.  
CodeArtifact는 Swift 5.9 이상 및 Xcode 15 이상을 권장합니다.

**Topics**
+ [CodeArtifact를 사용하여 Swift 설정](configure-swift.md)
+ [Swift 패키지 사용 및 게시](swift-publish-consume.md)
+ [Swift 패키지 이름 및 네임스페이스 정규화](swift-name-normalization.md)
+ [Swift 문제 해결](swift-troubleshooting.md)

# CodeArtifact를 사용하여 Swift Package Manager 설정
<a name="configure-swift"></a>

Swift Package Manager를 사용하여 AWS CodeArtifact에 패키지를 게시하거나 사용하려면 먼저 CodeArtifact 리포지토리에 액세스하기 위한 자격 증명을 설정해야 합니다. CodeArtifact 보안 인증 및 리포지토리 엔드포인트를 사용하여 Swift Package Manager CLI를 구성하는 권장 방법은 `aws codeartifact login` 명령을 사용하는 것입니다. Swift Package Manager를 수동으로 구성할 수도 있습니다.

## 로그인 명령으로 Swift 구성
<a name="configure-swift-login-command"></a>

`aws codeartifact login` 명령을 사용하여 CodeArtifact로 Swift Package Manager를 구성합니다.

**참고**  
로그인 명령을 사용하려면 Swift 5.8 이상이 필요하며 Swift 5.9 이상을 사용하는 것이 좋습니다.

`aws codeartifact login` 명령은 다음을 수행합니다.

1. CodeArtifact에서 인증 토큰을 가져와 사용자 환경에 저장합니다. 보안 인증이 저장되는 방식은 환경의 운영 체제에 따라 달라집니다.

   1. **macOS:** macOS 키체인 애플리케이션에 항목이 생성됩니다.

   1. **Linux 및 Windows:** `~/.netrc` 파일에 항목이 생성됩니다.

   모든 운영 체제에서 보안 인증 항목이 있는 경우 이 명령은 해당 항목을 새 토큰으로 대체합니다.

1. CodeArtifact 리포지토리 엔드포인트 URL을 가져와서 Swift 구성 파일에 추가합니다. 이 명령은 `/path/to/project/.swiftpm/configuration/registries.json`에 있는 프로젝트 수준 구성 파일에 리포지토리 엔드포인트 URL을 추가합니다.

**참고**  
이 `aws codeartifact login` 명령은 `Package.swift` 파일이 포함된 디렉터리에서 실행해야 하는 `swift package-registry` 명령을 호출합니다. 따라서 `aws codeartifact login` 명령은 Swift 프로젝트 내에서 실행해야 합니다.

**로그인 명령으로 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)을 참조하세요.

## 로그인 명령 없이 Swift 구성
<a name="configure-swift-without-login-command"></a>

[`aws codeartifact login` 명령을 사용하여 Swift를 구성](#configure-swift-login-command)하는 것이 좋지만 Swift Package Manager 구성을 수동으로 업데이트하여 로그인 명령 없이 Swift Package Manager를 구성할 수도 있습니다.

다음 절차에서는 AWS CLI 를 사용하여 다음을 수행합니다.

1. CodeArtifact에서 인증 토큰을 가져와 사용자 환경에 저장합니다. 보안 인증이 저장되는 방식은 환경의 운영 체제에 따라 달라집니다.

   1. **macOS:** macOS 키체인 애플리케이션에 항목이 생성됩니다.

   1. **Linux 및 Windows:** `~/.netrc` 파일에 항목이 생성됩니다.

1. CodeArtifact 리포지토리 엔드포인트 URL을 가져옵니다.

1. `~/.swiftpm/configuration/registries.json` 구성 파일에 리포지토리 엔드포인트 URL 및 인증 유형이 포함된 항목을 추가합니다.

**로그인 명령 없이 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(기본 명령 쉘 사용):

     ```
     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
     ```
   + Windows PowerShell:

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

------

1. 다음 명령을 실행하여 CodeArtifact 리포지토리의 엔드포인트를 가져올 수 있습니다. 리포지토리 엔드포인트는 패키지를 사용하거나 게시하도록 Swift Package Manager를 리포지토리로 이동하는 데 사용됩니다.
   + *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 ]
   + 윈도우(기본 커맨드 쉘 사용):

     ```
     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
     ```
   + Windows 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 Package Manager를 구성하는 데 사용할 때는 리포지토리 URL 엔드포인트 끝에 `login`을 추가해야 합니다. 이 절차는 이 절차의 명령으로 자동으로 수행됩니다.

1. 이 두 값을 환경 변수에 저장한 후 `swift package-registry login` 명령을 사용하여 Swift에 전달합니다.

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

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

------
#### [ Windows ]
   + 윈도우(기본 커맨드 쉘 사용):

     ```
     swift package-registry login %CODEARTIFACT_REPO%login --token %CODEARTIFACT_AUTH_TOKEN%
     ```
   + Windows 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(기본 명령 쉘 사용):

     ```
     $ swift package-registry set %CODEARTIFACT_REPO% [--scope my_scope]
     ```
   + Windows 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>

## CodeArtifact에서의 Swift 패키지 사용
<a name="consume-swift-packages"></a>

다음 절차에 따라 a AWS CodeArtifact 리포지토리의 Swift 패키지를 사용합니다.

**CodeArtifact 리포지토리에서 Swift 패키지를 사용하려면**

1. 아직 구성하지 않았다면, [CodeArtifact를 사용하여 Swift Package Manager 설정](configure-swift.md)의 단계에 따라 적절한 보안 인증과 함께 CodeArtifact 리포지토리를 사용하도록 Swift Package Manager를 구성합니다.
**참고**  
생성된 권한 부여 토큰은 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. 아직 구성하지 않았다면, [CodeArtifact를 사용하여 Swift Package Manager 설정](configure-swift.md)의 단계에 따라 적절한 보안 인증과 함께 CodeArtifact 리포지토리를 사용하도록 Swift Package Manager를 구성합니다.
**참고**  
생성된 권한 부여 토큰은 12시간 동안 유효합니다. 토큰이 생성된 후 12시간이 경과한 경우 새 토큰을 생성해야 합니다.

1. 패키지를 Xcode의 프로젝트에 종속 항목으로 추가합니다.

   1. **파일 > 패키지 추가**를 선택합니다.

   1. 검색 창을 사용하여 패키지를 검색합니다. 검색은 `package_scope.package_name` 형식으로 합니다.

   1. 패키지를 찾으면 패키지를 선택한 다음 **패키지 저장**을 선택합니다.

   1. 패키지가 확인되면 종속 항목으로 추가할 패키지 제품을 선택한 다음 **패키지 추가**를 선택합니다.

CodeArtifact 리포지토리를 Xcode와 함께 사용할 때 문제가 발생하는 경우 일반적인 문제 및 가능한 해결 방법은 [Swift 문제 해결](swift-troubleshooting.md)를 참조하세요.

## CodeArtifact에 Swift 패키지 게시
<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를 사용하여 CodeArtifact 리포지토리에 Swift 패키지를 게시할 수 있습니다.

1. 아직 구성하지 않았다면, [CodeArtifact를 사용하여 Swift Package Manager 설정](configure-swift.md)의 단계에 따라 적절한 보안 인증과 함께 CodeArtifact 리포지토리를 사용하도록 Swift Package Manager를 구성합니다.
**참고**  
생성된 권한 부여 토큰은 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
   ```

### Curl을 사용하여 CodeArtifact 패키지 게시
<a name="publish-swift-packages-curl"></a>

Swift 5.9 이상과 함께 제공되는 `swift package-registry publish` 명령을 사용하는 것이 좋지만 Curl을 사용하여 CodeArtifact에 Swift 패키지를 게시할 수도 있습니다.

다음 절차에 따라 Curl을 사용하여 Swift 패키지를 a AWS CodeArtifact 리포지토리에 게시합니다.

1. 아직 업데이트하지 않았다면 [CodeArtifact를 사용하여 Swift Package Manager 설정](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 명령을 사용하여 CodeArtifact에 Swift 패키지를 게시합니다.

------
#### [ 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>

다음 절차를 사용하여 GitHub에서 Swift 패키지를 가져와서 CodeArtifact 리포지토리에 다시 게시할 수 있습니다.

**Swift 패키지를 GitHub에서 가져와서 CodeArtifact에 다시 게시하려면**

1. 아직 구성하지 않았다면, [CodeArtifact를 사용하여 Swift Package Manager 설정](configure-swift.md)의 단계에 따라 적절한 보안 인증과 함께 CodeArtifact 리포지토리를 사용하도록 Swift Package Manager를 구성합니다.
**참고**  
생성된 권한 부여 토큰은 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. 5.9 이전의 Swift 버전을 사용하는 경우 `swift archive-source` 명령을 사용하여 패키지를 생성한 다음 Curl 명령을 사용하여 패키지를 게시해야 합니다.

      1. `CODEARTIFACT_AUTH_TOKEN` 및 `CODEARTIFACT_REPO` 환경 변수를 구성하지 않았거나 구성한 지 12시간이 넘었다면 [로그인 명령 없이 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 명령을 사용하여 CodeArtifact에 Swift 패키지를 게시합니다.

------
#### [ 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의 이름은 패키지가 게시될 때 제공된 이름과 다를 수 있습니다.

**패키지 이름 및 네임스페이스 정규화: ** CodeArtifact는 모든 문자를 소문자로 변환하여 Swift 패키지 이름과 네임스페이스를 정규화합니다.

**패키지 버전 정규화: ** CodeArtifact는 Swift 패키지 버전을 정규화하지 않습니다. CodeArtifact는 Semantic Versioning 2.0 버전 패턴만 지원합니다. 시맨틱 버전 관리에 관한 자세한 내용은 [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html)을 참조하세요.

정규화되지 않은 패키지 이름 및 네임스페이스는 CodeArtifact가 해당 요청의 입력을 정규화하므로, API 및 CLI 요청에도 사용할 수 있습니다. 예를 들어, `--package myPackage`과 `--namespace myScope`를 입력하면 값을 정규화하여 정규화된 패키지 이름인 `mypackage`과 `myscope` 네임스페이스를 가진 패키지로 반환합니다.

**IAM 정책과 같은 ARN에서는 정규화된 이름을 사용해야 합니다.**

패키지의 정규화된 이름을 찾으려면 `aws codeartifact list-packages` 명령을 사용합니다. 자세한 내용은 [패키지 이름 나열](list-packages.md) 단원을 참조하십시오.

# Swift 문제 해결
<a name="swift-troubleshooting"></a>

다음은 CodeArtifact를 Swift와 함께 사용할 때 일반적으로 발생하는 문제를 해결하는 데 유용한 정보입니다.

## Swift Package Manager를 구성한 후에도 Xcode에서 401 오류가 발생합니다.
<a name="swift-troubleshooting-xcode"></a>

**문제:** CodeArtifact 리포지토리의 패키지를 Xcode의 Swift 프로젝트에 대한 종속 항목으로 추가하려고 하면 [Swift를 CodeArtifact에 연결](configure-swift.md)하는 지침을 따랐는데도 401 무단 오류가 발생합니다.

**가능한 해결 방법:** 이 문제는 CodeArtifact 보안 인증이 저장된 macOS 키체인 애플리케이션의 문제로 인해 발생할 수 있습니다. 이 문제를 해결하려면 키체인 애플리케이션을 열고 CodeArtifact 항목을 모두 삭제하고 [CodeArtifact를 사용하여 Swift Package Manager 설정](configure-swift.md)의 지침에 따라 CodeArtifact 리포지토리를 사용하여 Swift Package Manager를 다시 구성하는 것이 좋습니다.

## 암호에 대한 키체인 프롬프트로 인해 Xcode가 CI 시스템에서 중단됨
<a name="swift-troubleshooting-ci-machine"></a>

**문제:** GitHub Actions와 같은 지속적 통합(CI) 서버의 Xcode 빌드의 일부로 CodeArtifact에서 Swift 패키지를 가져오려고 하면 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)을 참조하세요.