GitHub Package 사용하기: NuGet

참고하면 좋은 포스팅 : GitHub 패키지 저장소 호스팅: GitHub Package Registry 시작하기

GitHub Pacakge 란?

NPM, Maven, rubygems, NuGet 패키지 및 Docker 이미지를 배포할 수 있는 서비스

무스마에서는 GitHub Package 를 이용하여 NPM 패키지를 호스팅 하고 여러 프로젝트에서 잘 사용하고 있습니다.

그런데! 이번에는 .NET 라이브러리를 공유해야 할 상황이 왔는데요.

GitHub Package 는 .NET 패키지 관리자인 NuGet 또한 지원하기 때문에 이를 이용하여 성공적으로 공유할 수 있었습니다 🙂

dotnet CLI 를 이용하여 간단하게 GitHub Pacakge 에 게시하는 방법을 알아보겠습니다.

사전작업

Personal access tokens 발급받기

패키지를 게시 및 설치하려면 액세스 토큰이 필요합니다. 개인 액세스 토큰을 사용하여 사용자 이름으로 GitHub 패키지에 직접 인증 할 수 있습니다.

토큰을 발급받을 수 있는 페이지로 이동합니다.

  1. GitHub → User → Settings

  2. Developer settings → Personal access tokens

스크린샷 2020-12-17 오후 2 41 07

토큰 발급을 위하여 Generate new token 을 클릭합니다.

스크린샷 2020-12-17 오후 2 42 12

wrtie:packages 에 체크하고 토큰을 생성합니다.

write:pacakges scope 를 선택하면 자동으로 reporead:packages 가 선택됩니다.

패키지 게시를 할 필요가 없고 설치만 필요한 경우 read:pacakges scope 만 선택하세요.

스크린샷 2020-12-17 오후 2 42 58

생성된 토큰을 잘 복사해둡니다.

스크린샷 2020-12-17 오후 2 43 35

.NET SDK 설치

자신이 배포할 버전에 맞는 SDK 를 설치하세요.

Window

https://dotnet.microsoft.com/download 에서 다운로드

Mac

$ brew tap isen-ng/dotnet-sdk-versions
$ brew cask install dotnet-sdk2-2-400

Nuget 설치

Window

  1. https://www.nuget.org/downloads 에서 NuGet 4.1.0 이상 다운로드
  2. nuget.exe를 둔 폴더를 PATH 환경 변수에 추가

Mac

$ brew install nuget

Nuget.Config 작성

직접 작성하는 방법

OS NuGet.Config 파일 위치
Window %appdata%\NuGet\NuGet.Config
Mac/Linux ~/.config/NuGet/NuGet.Config 혹은 ~/.nuget/NuGet/NuGet.Config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
        <packageSources>
                <clear />
                <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
                <add key="github" value="https://nuget.pkg.github.com/[AUTHOR]/index.json" />
        </packageSources>
        <packageSourceCredentials>
                <github>
                        <add key="Username" value="[USER_NAME]" />
                        <add key="ClearTextPassword" value="[GITHUB_TOKEN]" />
                </github>
        </packageSourceCredentials>
</configuration>
  • AUTHOR : 조직의 이름을 작성합니다. (e.g. musma)
  • USER_NAME : 조직의 이름을 작성합니다.
  • GITHUB_TOKEN : 발급받은 토큰을 붙여넣습니다.

CLI를 이용하는 방법

> nuget sources add \
    -name github \
    -source https://nuget.pkg.github.com/[AUTHOR]/index.json \
    -username [USER_NAME] \
    -password [GITHUB_TOKEN] \
    -StorePasswordInClearText \
    -configfile %appdata%\NuGet\NuGet.Config
  • AUTHOR : 조직의 이름을 작성합니다. (e.g. musma)
  • USER_NAME : 조직의 이름을 작성합니다.
  • GITHUB_TOKEN : 발급받은 토큰을 붙여넣습니다.

패키지 게시

.csproj 수정

게시할 패키지의 *.csproj 파일에 아래와 같이 프로퍼티를 추가합니다.

<PropertyGroup>
  <TargetFramework>netstandard2.0</TargetFramework>
  <PackageId>[PACKAGE_NANE]</PackageId>
  <Version>1.0.0</Version>
  <Authors>[AUTHOR]</Authors>
  <Company>[COMPANY]</Company>
  <RepositoryUrl>https://github.com/[OWNER]/[REPOSITORY]</RepositoryUrl>
</PropertyGroup>
  • PACKAGE_NAME : 배포할 패키지의 이름을 작성합니다.
  • AUTHOR : 작성자를 작성합니다.
  • COMPANY : 조직의 이름을 작성합니다.
  • OWNER : 조직의 이름을 작성합니다.
  • REPOSITORY : 게시하려는 패키지가 포함 된 저장소의 이름을 작성합니다.

프로젝트 패키징

$ dotnet pack --configuration Release

패키지 게시

$ dotnet nuget push "bin/Release/[PACKAGE_NANE].1.0.0.nupkg" --source "github"
  • PACKAGE_NAME : 배포할 패키지의 이름을 작성합니다.

패키지 설치

프로젝트에 포함된 공통 모듈을 제거하고 GitHub Package 를 통해 설치하는 방법을 알아보겠습니다.

단순히 패키지를 받아올 목적이라면 아래 단계를 건너 뛰고 패키지 추가 부터 참고하세요.

솔루션에서 모듈 제거

삭제할 모듈이 참조하는 다른 모듈이 있는지 확인 후 존재하면 참조 관계를 삭제합니다.

$ cd [MODULE_NAME]
$ dotnet list reference
$ dotnet remove reference [REFERENCE_MODULE_NAME]

참조 관계를 삭제 후 솔루션에서 제거합니다.

$ dotnet sln remove [MODULE_NAME]
$ dotnet sln remove [REFERENCE_MODULE_NAME]
  • MODULE_NAME : 삭제할 모듈의 이름을 작성합니다.
  • REFERENCE_MODULE_NAME : 삭제할 모듈이 참조하고 있는 모듈의 이름을 작성합니다.

모듈 제거

솔루션에서 제거를 완료하였다면 모듈 제거를 진행합니다.

$ rm -rf [MODULE_NAME]
  • MODULE_NAME : 삭제할 모듈의 이름을 작성합니다.

패키지 추가

패키지 추가는 VS Code 환경에서 진행하였습니다.

  1. 패키지 우클릭 → NuGet 패키지 관리 선택

    스크린샷 2021-01-05 오후 6 24 48

  2. 모든 소스 → github 선택

    스크린샷 2021-01-05 오후 6 25 30

  3. 추가하고자 하는 패키지 선택 → 패키지 추가

    스크린샷 2021-01-05 오후 6 25 41

  4. 패키지 추가에 성공한 것을 확인할 수 있습니다.

    스크린샷 2021-01-05 오후 6 25 57

  5. packages.config 확인

    <package id="CAutoManagerSdk" version="1.0.0" targetFramework="net471" />
    
  6. *.csproj 확인

    <Reference Include="CAutoManagerSdk">
      <HintPath>..\packages\CAutoManagerSdk.1.0.0\lib\netstandard2.0\CAutoManagerSdk.dll</HintPath>
    </Reference>
    

마치며

프로젝트에 필요한 패키지를 매번 복사-붙여넣기 하는 것은 프로젝트 구성을 복잡하게 만들 뿐만 아니라 생성시에도 매우 귀찮은데요.

사설 저장소를 이용하자니 돈도 들고 관리도 어려운데, 오픈소스는 물론이고 private 프로젝트에서도 무료로 사용가능하다니 정말 혜자스러운 서비스 인 것 같습니다.

References