NuGet 레지스트리의 URL
GitHub.com에서 GitHub에 접근하면, 패키지를 https://nuget.pkg.github.com에 게시하게 됩니다. 이 문서의 예제에서는 이 URL을 사용합니다.
여기서 SUBDOMAIN은/는 기업의 고유한 하위 도메인입니다. octocorp.ghe.com과 같은 다른 도메인에서 GitHub에 접근할 경우에는 "https://nuget.pkg.github.com"을 https://nuget.SUBDOMAIN.ghe.com로 바꿉니다.
GitHub Packages 인증
참고
GitHub Packages은(는) personal access token (classic)을(를) 사용하는 인증만 지원합니다. 자세한 내용은 개인용 액세스 토큰 관리을(를) 참조하세요.
프라이빗, 내부, 퍼블릭 패키지를 게시, 설치, 삭제하려면 액세스 토큰이 필요합니다.
personal access token (classic)을 사용하여 GitHub Packages 또는 GitHub API에 인증할 수 있습니다. personal access token (classic)을(를) 만들 때 필요에 따라 토큰의 범위를 다르게 할당할 수 있습니다. personal access token (classic)의 패키지 관련 범위에 대한 자세한 내용은 GitHub 패키지에 대한 사용 권한 정보를 참조하세요.
GitHub Actions 워크플로 내에서 GitHub Packages 레지스트리에 인증하려면 다음을 사용할 수 있습니다.
- 워크플로 리포지토리와 연결된 패키지를 게시하려면
GITHUB_TOKEN을 사용합니다. - 다른 프라이빗 리포지토리와 연결된 패키지를 설치하기 위한 최소한
read:packages범위가 있는 personal access token (classic)(리포지토리에 패키지에 대한 읽기 액세스 권한이 부여된 경우GITHUB_TOKEN을 사용할 수 있습니다. 패키지의 액세스 제어 및 표시 여부 구성을(를) 참조하세요).
GitHub Actions 워크플로에서 인증
이 레지스트리는 세분화된 권한을 지원합니다. 세분화된 권한을 지원하는 레지스트리는 GitHub Actions 워크플로가 personal access token을(를) 사용하여 레지스트리에 인증하는 경우, GITHUB_TOKEN로 워크플로를 업데이트하는 것을 권장합니다. personal access token로 레지스트리에 인증하는 워크플로를 업데이트하는 방법에 대한 지침은 GitHub Actions를 사용하여 패키지 게시 및 설치를 참조하세요.
참고
GitHub Actions 워크플로에서 REST API를 사용하여 패키지를 삭제하고 복원하는 기능은 현재 공개 미리 보기 버전이며 변경될 수 있습니다.
토큰이 패키지에 대해 admin 권한이 있는 경우, GitHub Actions 워크플로에서 GITHUB_TOKEN로 REST API를 사용하여 패키지를 삭제하거나 복원할 수 있습니다. 워크플로를 사용하여 패키지를 게시하는 리포지토리와 패키지에 명시적으로 연결한 리포지토리에는 리포지토리의 패키지에 대한 admin 권한이 자동으로 부여됩니다.
GITHUB_TOKEN에 대한 자세한 내용은 워크플로에서 인증에 GITHUB_TOKEN 사용을(를) 참조하세요. 작업에서 레지스트리를 사용하는 모범 사례에 대한 자세한 내용은 안전 사용 참조를 참조하세요.
다음 명령어를 사용하여 리포지토리의 nuget.config 파일에 personal access token를 하드코딩하지 않고 GITHUB_TOKEN을 사용하여 GitHub Actions 워크플로에서 GitHub Packages에 인증합니다.
dotnet nuget add source --username USERNAME --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/NAMESPACE/index.json"
`NAMESPACE`를 개인 계정 이름 또는 패키지의 범위로 지정된 조직의 이름으로 바꿉니다.
`USERNAME`을(를) 인증된 소스에 연결할 때 사용할 사용자 이름으로 바꿉니다.
GitHub Codespaces및 GitHub Actions에 대한 패키지의 액세스 권한을 독립적으로 부여하도록 선택할 수도 있습니다. 자세한 내용은 패키지의 액세스 제어 및 표시 여부 구성 및 패키지의 액세스 제어 및 표시 여부 구성을(를) 참조하세요.
personal access token을(를) 사용하여 인증
참고
GitHub Packages은(는) personal access token (classic)을(를) 사용하는 인증만 지원합니다. 자세한 내용은 개인용 액세스 토큰 관리을(를) 참조하세요.
프라이빗, 내부, 퍼블릭 패키지를 게시, 설치, 삭제하려면 액세스 토큰이 필요합니다.
personal access token (classic)을 사용하여 GitHub Packages 또는 GitHub API에 인증할 수 있습니다. personal access token (classic)을(를) 만들 때 필요에 따라 토큰의 범위를 다르게 할당할 수 있습니다. personal access token (classic)의 패키지 관련 범위에 대한 자세한 내용은 GitHub 패키지에 대한 사용 권한 정보를 참조하세요.
GitHub Actions 워크플로 내에서 GitHub Packages 레지스트리에 인증하려면 다음을 사용할 수 있습니다.
- 워크플로 리포지토리와 연결된 패키지를 게시하려면
GITHUB_TOKEN을 사용합니다. - 다른 프라이빗 리포지토리와 연결된 패키지를 설치하기 위한 최소한
read:packages범위가 있는 personal access token (classic)(리포지토리에 패키지에 대한 읽기 액세스 권한이 부여된 경우GITHUB_TOKEN을 사용할 수 있습니다. 패키지의 액세스 제어 및 표시 여부 구성을(를) 참조하세요).
적절한 범위의personal access token (classic)으로 GitHub Packages에서 패키지를 게시하고 설치해야 합니다. 자세한 내용은 GitHub 패키지 소개을(를) 참조하세요.
dotnet 명령줄 인터페이스(CLI)로 GitHub Packages에 인증하려면 dotnet CLI 클라이언트에 대한 packageSources에서GitHub Packages를 소스로 지정하여 프로젝트 디렉터리 파일에서 nuget.config 파일을 만듭니다.
다음과 같이 반드시 교체하십시오.
*
USERNAME을 GitHub에 있는 개인 계정의 이름으로 바꿉니다.
-
`TOKEN`을 personal access token (classic)과 함께 사용합니다. -
`NAMESPACE`을 개인 계정 또는 조직의 이름과 함께 사용합니다, 패키지가 범위로 지정된.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="github" value="https://nuget.pkg.github.com/NAMESPACE/index.json" />
</packageSources>
<packageSourceCredentials>
<github>
<add key="Username" value="USERNAME" />
<add key="ClearTextPassword" value="TOKEN" />
</github>
</packageSourceCredentials>
</configuration>
패키지 게시
참고
NuGet 패키지 버전의 nupkg 보관 파일 크기는 2.147GB보다 작아야 합니다.
_nuget.config_ 파일로 인증하거나 GitHub personal access token (classic)으로 `--api-key` 명령줄 옵션을 사용하거나, `dotnet` 명령줄 인터페이스(CLI)에서 직접 실행할 수 있는 명령을 사용하여 GitHub Packages에 패키지를 게시할 수 있습니다.
`OWNER`을(를) 사용자 이름 또는 회사 이름으로 바꾸고 `YOUR_GITHUB_PAT`을(를) personal access token(으)로 바꿉니다.
dotnet nuget add source --username OWNER --password YOUR_GITHUB_PAT --store-password-in-clear-text --name github "https://nuget.pkg.github.com/OWNER/index.json"
NuGet 레지스트리는 조직 또는 개인 계정 내에 패키지를 저장하며 패키지를 리포지토리와 연결할 수 있게 합니다. 리포지토리에서 사용 권한을 상속할지 또는 리포지토리와 독립적으로 세분화된 권한을 설정할지 선택할 수 있습니다.
패키지를 처음 게시할 때 기본 표시 여부는 프라이빗입니다. 표시 유형 또는 액세스 권한을 변경하려면 패키지의 액세스 제어 및 표시 여부 구성을(를) 참조하세요. 게시된 패키지를 리포지토리와 연결하는 방법에 대한 자세한 내용은 리포지토리를 패키지에 연결 참조하세요.
project RepositoryURL 파일에 __ 지정하면 게시된 패키지가 지정된 리포지토리에 자동으로 연결됩니다. 자세한 내용은 NuGet 레지스트리 작업 참조하세요. 이미 게시된 패키지를 리포지토리에 연결하는 방법에 대한 자세한 내용은 리포지토리를 패키지에 연결 참조하세요.
GitHub personal access token를 API 키로 사용하여 패키지 게시하기
GitHub 계정에서 사용할 personal access token가 아직 없는 경우, 개인용 액세스 토큰 관리을 참조하세요.
-
새 project 만듭니다.
PROJECT_NAME을 프로젝트에 지정하고자 하는 이름으로 바꾸십시오.dotnet new console --name PROJECT_NAME -
프로젝트를 패키징합니다.
dotnet pack --configuration Release -
personal access token을(를) API 키로 사용하여 패키지를 게시합니다.
PROJECT_NAME을 프로젝트 이름으로,1.0.0를 패키지 버전 번호로,YOUR_GITHUB_PAT을 personal access token로 교체합니다.dotnet nuget push "bin/Release/PROJECT_NAME.1.0.0.nupkg" --api-key YOUR_GITHUB_PAT --source "github"
데이터 재사용 가능 패키지 레지스트리에서 패키지 보기 %}
_nuget.config_ 파일을 사용하여 패키지 게시
게시할 때 패키지를 저장소에 연결하는 경우, dotnet pack 명령을 사용하여 해당 버전에 맞는 .nuspec 파일을 만듭니다. 패키지를 만드는 방법에 대한 자세한 내용은 Microsoft 설명서의 패키지 만들기 및 게시를 참조하세요.
참고
리포지토리에 연결된 패키지를 게시하는 경우, 패키지는 자동으로 연결된 리포지토리의 액세스 권한을 상속받고, 조직에서 액세스 권한의 자동 상속을 사용하지 않도록 설정하지 않은 한 연결된 리포지토리의 GitHub Actions 워크플로에 패키지에 대한 액세스 권한이 자동으로 부여됩니다. 자세한 내용은 패키지의 액세스 제어 및 표시 여부 구성을(를) 참조하세요.
-
GitHub Packages에 인증합니다. 자세한 내용은 GitHub Packages에 인증을 참조하세요.
-
새 project 만듭니다.
PROJECT_NAME를 프로젝트에 지정하려는 이름으로 바꾸십시오.dotnet new console --name PROJECT_NAME -
프로젝트의 특정 정보를 프로젝트 파일에 추가하는데, 파일은 _.csproj_로 끝납니다. 반드시 다음과 같이 교체하십시오.
-
`1.0.0`을 패키지의 버전 번호로 바꿉니다. -
`OWNER`를 패키지를 연결할 리포지토리를 소유한 개인 계정 또는 조직의 이름으로 바꿉니다. -
`REPOSITORY`를 패키지를 연결할 리포지토리의 이름으로 바꿉니다.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <PackageId>PROJECT_NAME</PackageId> <Version>1.0.0</Version> <Authors>AUTHORS</Authors> <Company>COMPANY_NAME</Company> <PackageDescription>PACKAGE_DESCRIPTION</PackageDescription> <RepositoryUrl>https://github.com/OWNER/REPOSITORY</RepositoryUrl> </PropertyGroup> </Project> -
-
프로젝트를 패키징합니다.
dotnet pack --configuration Release -
`key`를 사용해 _nuget.config_ 파일에 지정한 패키지를 게시합니다. `PROJECT_NAME` project 이름으로 바꾸고 `1.0.0` 패키지의 버전 번호로 바꿉다.dotnet nuget push "bin/Release/PROJECT_NAME.1.0.0.nupkg" --source "github"
데이터 재사용 가능 패키지 레지스트리에서 패키지 보기 %}
동일한 리포지토리에 여러 패키지 게시
여러 패키지를 동일한 리포지토리에 연결하려면 모든 RepositoryURL project 파일의 __ 필드에 동일한 GitHub 리포지토리 URL을 사용합니다. GitHub은 해당 필드를 기반으로 리포지토리와 일치시킵니다.
다음 예시에서는 MY_APP 및 MY_OTHER_APP 프로젝트를 동일한 리포지토리에 게시합니다.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<PackageId>MY_APP</PackageId>
<Version>1.0.0</Version>
<Authors>Octocat</Authors>
<Company>GitHub</Company>
<PackageDescription>This package adds a singing Octocat!</PackageDescription>
<RepositoryUrl>https://github.com/my-org/my-repo</RepositoryUrl>
</PropertyGroup>
</Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<PackageId>MY_OTHER_APP</PackageId>
<Version>1.0.0</Version>
<Authors>Octocat</Authors>
<Company>GitHub</Company>
<PackageDescription>This package adds a dancing Octocat!</PackageDescription>
<RepositoryUrl>https://github.com/my-org/my-repo</RepositoryUrl>
</PropertyGroup>
</Project>
패키지 설치
GitHub의 패키지를 프로젝트에서 사용하는 것은 _nuget.org_의 패키지를 사용하는 것과 비슷합니다. 패키지 이름과 버전을 지정하여 .csproj 파일에 종속성을 추가하세요. project .csproj 파일을 사용하는 방법에 대한 자세한 내용은 Microsoft 설명서의 NuGet 패키지 작업을 참조하세요.
-
GitHub Packages에 인증합니다. 자세한 내용은 GitHub Packages에 인증을 참조하세요.
-
패키지를 사용하려면
ItemGroup을 추가하고, .csproj 프로젝트 파일에서PackageReference필드를 구성합니다.PACKAGE_NAME의Include="PACKAGE_NAME"값을 패키지 종속성으로 바꾸고X.X.X의Version="X.X.X"값을 사용하려는 패키지의 버전으로 바꿉니다.<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <PackageId>My-app</PackageId> <Version>1.0.0</Version> <Authors>Octocat</Authors> <Company>GitHub</Company> <PackageDescription>This package adds an Octocat!</PackageDescription> <RepositoryUrl>https://github.com/OWNER/REPOSITORY</RepositoryUrl> </PropertyGroup> <ItemGroup> <PackageReference Include="PACKAGE_NAME" Version="X.X.X" /> </ItemGroup> </Project> -
`restore` 명령으로 패키지를 설치합니다.dotnet restore
문제 해결
GITHUB_TOKEN을 이용해 GitHub Actions 워크플로에서 GitHub Packages 레지스트리를 인증한다면, 토큰은 워크플로를 실행하는 리포지토리가 아닌 다른 리포지토리에 있는 프라이빗 리포지토리 기반 패키지에는 액세스할 수 없습니다. 다른 리포지토리와 연관된 패키지에 접근하려면, 대신 read:packages 범위로 personal access token (classic)를 생성하고 이 토큰을 시크릿으로 전달합니다.
공용 패키지를 복원할 때 일시적인 403 오류
표준 공용 패키지(예: __)를 복원할 때, GitHub Packages를 Microsoft.Extensions.*와 함께 사용하다가 간헐적으로 403 Forbidden 오류가 발생하는 경우, NuGet이 모든 패키지에 대해 구성된 패키지 원본을 모두 쿼리하기 때문에 이러한 문제가 발생할 수 있습니다. GitHub Packages 인증이 일시적으로 실패하면, GitHub Packages에 없는 패키지의 경우에도 전체 복원이 차단될 수 있습니다.
이를 방지하려면 NuGet 패키지 원본 매핑 을 사용하여 패키지를 특정 원본으로 라우팅합니다.
교체:
-
`NAMESPACE`을 GitHub Packages NuGet 피드를 소유한 개인 계정 또는 조직의 이름과 함께 사용합니다. -
`PACKAGE-ID-PREFIX`을 GitHub Packages에 호스팅된 패키지에 사용하는 NuGet 패키지 ID 접두사와 함께 사용합니다. 여러 접두사를 사용하는 경우 각 접두사에 대한 추가 `<package>` 항목을 추가합니다.
<configuration>
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="github" value="https://nuget.pkg.github.com/NAMESPACE/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
<packageSource key="github">
<package pattern="PACKAGE-ID-PREFIX.*" />
</packageSource>
</packageSourceMapping>
</configuration>
NuGet은 가장 구체적인 일치 패턴을 사용하므로 패키지 일치 PACKAGE-ID-PREFIX.* 는 GitHub Packages에서만 페치되고 다른 모든 패키지는 nuget.org 가져옵니다. 이렇게 하면 개인 패키지가 GitHub Packages 피드에서만 제공되도록 하여 종속성 혼동 공격을 방지할 수 있습니다.
추가 참고 자료
-
[AUTOTITLE](/packages/learn-github-packages/deleting-and-restoring-a-package)