Arch Linux에서 .NET Core 앱을 배포하는 방법

이 게시물에서는 taskcore이라는 netcore CLI 앱을 빌드하고 makepkgself-contained .NET 앱 간의 상호 작용에 대해 알아봅니다. PKGBUILD 파일에서 시작하여 이 self-contained 앱에서 수행하는 작업을 조사합니다.

독립형 앱이란 무엇입니까?



.NET 세계에서 이는 앱의 게시된 아티팩트가 사용자 시스템에 .NET을 설치하지 않고도 실행할 수 있는 모든 것을 포함한다는 것을 의미합니다.

앱 빌드



이것은 publish command을 사용하여 Arch Linux에서 taskcore 앱을 빌드하기 위한 PKGBUILD입니다.

pkgname=taskcore
pkgver=1.0.0beta3
_pkgver=1.0.0-beta.3
pkgrel=1
arch=('x86_64')
url='https://github.com/tarikguney/taskcore'
license=("APACHE")
depends=("icu")
makedepends=("dotnet-sdk")
options=("staticlibs")
source=("$url/archive/v$_pkgver.tar.gz")
sha256sums=('8472c31bb7cff8b6f543a46288753747d9c47fee8f32b3e198f8da5bcea3fca6')

build() {
  cd "$pkgname-$_pkgver/TaskCore.App"
  MSBUILDDISABLENODEREUSE=1 dotnet publish \
    --configuration Release \
    --self-contained true \
    --runtime linux-x64 \
    -p:PublishTrimmed=true \
    --output ../$pkgname \
    ./TaskCore.App.csproj
}

package() {
  cd "$pkgname-$_pkgver"

  install -d $pkgdir/usr/{bin,lib}
  cp -r $pkgname "$pkgdir/usr/lib/"
  ln -s "/usr/lib/$pkgname/$pkgname" "$pkgdir/usr/bin/$pkgname"
}


종속성



Arch Linux에 .NET Core를 설치하는 것은 매우 쉽습니다.

depends=("icu")
makedepends=("dotnet-sdk")

이 앱을 실행하려면 icu 패키지(유니코드 라이브러리용 국제 구성요소)가 필요합니다. 그렇지 않으면 다음 오류가 발생합니다.

Couldn't find a valid ICU package installed on the system. Set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support.

makepkg 옵션


staticlibsPKGBUILD 옵션을 사용하여 Arch에 패키지에 정적 라이브러리 파일을 남겨두도록 지시해야 합니다. 그렇지 않으면 makepkg는 라이브러리가 OS에서 중복된 파일을 피하기 위해 종속성 패키지로 설치된다고 가정합니다.

게시 인수


-p:PublishTrimmed=true는 실행 파일에 정적으로 연결되어 있지 않은 경우 빌드 출력에서 ​​사용하지 않는 라이브러리를 제거합니다.
--self-contained true는 플랫폼별 실행 파일을 생성하므로 대상 플랫폼을 --runtime linux-x64 , 다른 옵션은 linux-arm64 또는 linux-musl-x64 Alpine Linux와 같은 musl을 사용하는 경량 배포판에 포함해야 합니다.
-p:PublishSingleFile=true 를 사용하여 실행 파일 내부에 라이브러리를 게시할 수 있지만 makepkg 실행 파일에서 모든 라이브러리를 제거합니다. 이 최적화는 기호(디버그에 일반적으로 사용됨)를 제거하고 더 가벼운 패키지를 얻는 데 유용하지만 .NET의 경우 다음을 사용해야 합니다.

options=("!strip")
MSBUILDDISABLENODEREUSE=1는 어떻습니까? 빌드를 여러 번 실행할 때 이 오류를 발견했습니다.

MSBUILD : error MSB4166: Child node "2" exited prematurely. Shutting down...

실패한 빌드는 MSBuild 프로세스를 방치하는 것 같습니다.

앱을 패키징하는 방법



모든 빌드 출력을 /usr/lib/taskcore로 이동해야 합니다.

cp -r $pkgname "$pkgdir/usr/lib/"

그런 다음 심볼릭 링크를 사용하여 로컬로 로그인한 사용자가 taskcore 명령에 액세스할 수 있도록 해야 합니다.

ln -s "/usr/lib/$pkgname/$pkgname" "$pkgdir/usr/bin/$pkgname"
# /usr/bin/taskcore -> /usr/lib/taskcore/taskcore

그리고 완료되었습니다! 우리는 Linux용 .NET 독립형 앱을 처음으로 만들었습니다. 그냥 빌드:

makepkg -s

.NET에 대한 추가 정보



.NET으로 시작하고 싶다면 Scott Hanselman의 멋진 비디오를 볼 수 있습니다.

좋은 웹페이지 즐겨찾기