다시 덮다

다시 덮다

다시 덮다

현재 NixOs의 Nix 패키지 관리자를 사용하여 dot-net-core-sdk 2.0을 설치하려고 합니다.

저는 NixOs, Nix, bash 스크립팅, ELF 같은 것에 익숙하지 않습니다. 하지만 dot-net-core-sdk 2.0에 대한 유효한 Nix 패키지 설명을 성공적으로 만든 것 같습니다.

그러나 새 프로젝트를 생성하려고 하면 console콘솔 템플릿을 찾을 수 없다는 메시지가 나타납니다.

No templates matched the input template name: console.

이야기가 너무 길어요..

Nix 패키지와 빌드 스크립트를 다음과 같이 정의했습니다.

dotnet-sdk.nix

with import <nixpkgs> {};

stdenv.mkDerivation {
  name = "dotnet-sdk-2.0";

  builder = ./builder.sh;

  libPath = stdenv.lib.makeLibraryPath
    [ lttng-tools kerberos zlib gettext openssl icu libunwind eject stdenv.cc.cc glib ];

  src = fetchurl {
    url = "https://download.microsoft.com/download/1/B/4/1B4DE605-8378-47A5-B01B-2C79D6C55519/dotnet-sdk-2.0.0-linux-x64.tar.gz";
    sha256 = "6059a6f72fb7aa6205ef4b52583e9c041fd128e768870a0fc4a33ed84c98ca6b";
  };
}

builder.sh

source $stdenv/setup

mkdir -p $out/dotnet-sdk

echo "unpacking $src..."
tar xvfa $src -C $out/dotnet-sdk

echo "unpacking dotnet-sdk..."
p=$out/libexec/dotnet
mkdir -p $out/libexec
mv $out/dotnet-sdk $p

ls -lrth $p

patchelf --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" --force-rpath --set-rpath $libPath --debug $p/dotnet

echo "libPath"
echo $libPath

mkdir -p $out/bin
ln -s $p/dotnet $out/bin/dotnet

패키지를 성공적으로 빌드할 수 있습니다.

$ sudo nix-build dotnet-sdk.nix 

그러면 다음으로 끝나는 긴 출력이 생성됩니다.

...
unpacking dotnet-sdk...
total 136K
-rw-r--r-- 1 nixbld1 nixbld 8.0K Jul 20 23:06 ThirdPartyNotices.txt
-rw-r--r-- 1 nixbld1 nixbld 1.1K Jul 20 23:06 LICENSE.txt
-rwxr-xr-x 1 nixbld1 nixbld 104K Jul 20 23:16 dotnet
drwxr-xr-x 3 nixbld1 nixbld 4.0K Aug  3 19:34 store
drwxr-xr-x 3 nixbld1 nixbld 4.0K Aug  3 19:34 shared
drwxr-xr-x 3 nixbld1 nixbld 4.0K Aug  3 19:34 sdk
drwxr-xr-x 3 nixbld1 nixbld 4.0K Aug  3 19:34 host
drwxr-xr-x 4 nixbld1 nixbld 4.0K Aug  3 19:34 additionalDeps
patching ELF file `/nix/store/f1sankahbj7pss7vjrvbmng9z7gd08a6-dotnet-sdk-2.0/libexec/dotnet/dotnet'
Kernel page size is 4096 bytes
new rpath is `/nix/store/xdv40bsxp4c7m2nw63nrnkadmivczk24-lttng-tools-2.9.3/lib:/nix/store/b7yiqkykhj3lr7dlb3v81rsdasjg32jw-libkrb5-1.15/lib:/nix/store/sg6ri2jj92sbv7f4rvchzr00d24pi4nq-zlib-1.2.11/lib:/nix/store/s70cbg1lh45h3gl6xplz6bi2qdszi2cf-gettext-0.19.8/lib:/nix/store/b6d4mxvj5wdnf28lpww73pllmm0zd2nv-openssl-1.0.2l/lib:/nix/store/03gqmzrbh1pr5izy24gmyw1bfdzpy6q8-icu4c-58.2/lib:/nix/store/f4xflmvgszhrwa1r1jn5fddz8j196qzv-libunwind-1.1/lib:/nix/store/awxn3kfww8hjnd1pyji4zdmmi2x3kvzb-util-linux-2.29.2/lib:/nix/store/lc9cdddv2xv45ighz8znsanjfgkcdgbx-gcc-5.4.0-lib/lib:/nix/store/75pmwxf02m6i4vd3b0iybc3w54xf4r2z-glib-2.50.3/lib'
rpath is too long, resizing...
DT_NULL index is 28
replacing section `.dynamic' with size 560
replacing section `.dynstr' with size 22942
replacing section `.interp' with size 80
this is an executable
using replaced section `.interp'
using replaced section `.dynstr'
using replaced section `.dynamic'
last replaced is 22
looking at section `.interp'
looking at section `.note.ABI-tag'
replacing section `.note.ABI-tag' which is in the way
looking at section `.note.gnu.build-id'
replacing section `.note.gnu.build-id' which is in the way
looking at section `.hash'
replacing section `.hash' which is in the way
looking at section `.dynsym'
replacing section `.dynsym' which is in the way
looking at section `.dynstr'
looking at section `.gnu.version'
first reserved offset/addr is 0x8a38/0x408a38
first page is 0x400000
needed space is 36624
needed space is 36680
needed pages is 1
changing alignment of program header 2 from 2097152 to 4096
changing alignment of program header 3 from 2097152 to 4096
clearing first 38856 bytes
rewriting section `.dynamic' from offset 0x19da8 (size 544) to offset 0x270 (size 560)
rewriting section `.dynstr' from offset 0x4308 (size 22320) to offset 0x4a0 (size 22942)
rewriting section `.dynsym' from offset 0x1d10 (size 9720) to offset 0x5e40 (size 9720)
rewriting section `.hash' from offset 0x1298 (size 2680) to offset 0x8438 (size 2680)
rewriting section `.interp' from offset 0x1238 (size 28) to offset 0x8eb0 (size 80)
rewriting section `.note.ABI-tag' from offset 0x1254 (size 32) to offset 0x8f00 (size 32)
rewriting section `.note.gnu.build-id' from offset 0x1274 (size 36) to offset 0x8f20 (size 36)
rewriting symbol table section 3
libPath
/nix/store/xdv40bsxp4c7m2nw63nrnkadmivczk24-lttng-tools-2.9.3/lib:/nix/store/b7yiqkykhj3lr7dlb3v81rsdasjg32jw-libkrb5-1.15/lib:/nix/store/sg6ri2jj92sbv7f4rvchzr00d24pi4nq-zlib-1.2.11/lib:/nix/store/s70cbg1lh45h3gl6xplz6bi2qdszi2cf-gettext-0.19.8/lib:/nix/store/b6d4mxvj5wdnf28lpww73pllmm0zd2nv-openssl-1.0.2l/lib:/nix/store/03gqmzrbh1pr5izy24gmyw1bfdzpy6q8-icu4c-58.2/lib:/nix/store/f4xflmvgszhrwa1r1jn5fddz8j196qzv-libunwind-1.1/lib:/nix/store/awxn3kfww8hjnd1pyji4zdmmi2x3kvzb-util-linux-2.29.2/lib:/nix/store/lc9cdddv2xv45ighz8znsanjfgkcdgbx-gcc-5.4.0-lib/lib:/nix/store/75pmwxf02m6i4vd3b0iybc3w54xf4r2z-glib-2.50.3/lib
/nix/store/f1sankahbj7pss7vjrvbmng9z7gd08a6-dotnet-sdk-2.0

help이제 개체 파일 누락에 대한 이상한 오류 없이 바이너리에서 성공적으로 실행하고 기능할 수 있습니다 .versiondotnet

$ result/bin/dotnet --version
2.0.0

하지만, 새 콘솔 애플리케이션을 만들려고 하면 다음 오류가 발생합니다.

$ /etc/nixos/dotnet-sdk/result/bin/dotnet new console
No templates matched the input template name: console.

Templates      Short Name      Language      Tags
-------------------------------------------------

왜 템플릿을 찾을 수 없는지 모르겠지만 --force-rpath빌드 스크립트에서 patchelf를 사용하여 수정했을 때 바이너리에서 뭔가를 엉망으로 만들었을 수도 있다는 약한 가설이 있습니다.

  • 내 패키지 구성과 빌드 스크립트가 괜찮아 보이나요? (예: 내 Nix 패키지 설명 및 빌드 스크립트와 관련된 문제가 아닙니다.)

  • patchelf를 사용하여 바이너리를 수정할 때 보조 네트워크 핵심 디렉터리에 대한 링크를 제공하는 것과 같은 명백한 내용을 놓치고 있습니까?

  • NixO에서 Net Core SDK 2.0이 작동하도록 하려면 또 무엇을 할 수 있나요?

관련 정보