나를 GUIX에 매료시킨 이유 중 하나는 서로 방해하지 않고 동시에 다양한 버전의 패키지를 "설치"할 수 있다는 점이었습니다. 하지만 실제로 이러한 다양한 버전을 사용하는 방법을 모르겠습니다.
예를 들어 최근에는이 pyyaml
패키지는 5.4.1에서 6.0으로 업그레이드되었습니다.. 여러 가지 이유로 5.4.1을 계속 사용하고 싶습니다. (여기서는 예를 들어 pyyaml을 사용하고 있습니다.) 내 스토어에는 이전 버전이 있습니다.
$ ls -d1 /gnu/store/*pyyaml*
/gnu/store/22v8l25b33vs65wjd9ap28n772bvlih3-python-pyyaml-5.4.1/
/gnu/store/2j2s1jd6y8x7mlqjp968955misx1qw1c-python-pyyaml-6.0/
/gnu/store/54imz4x65s3xbjrgrfswgk815gfkhk4b-python-pyyaml-5.4.1/
/gnu/store/6537a8na1rbilffqqi642q0lipqfi2zg-python-pyyaml-5.4.1.drv
/gnu/store/6flrrmhq203vg6awdw7r2lsmzix4g2rh-python-pyyaml-6.0-guile-builder
/gnu/store/73k3qdz9rdh64pl7a0f0951zm2pbx5s2-python-pyyaml-5.4.1.drv
/gnu/store/7bcbwi93ihz8v2sdzmj6l9vhjqaxr14l-python-pyyaml-5.4.1-builder
...
이전 버전을 어떻게 사용하나요?
이와 같은 이전 버전을 사용하는 것만으로도 괜찮습니다. 예를 들어, 저는 다음과 같이 작동하길 원합니다:
$ guix shell "[email protected]" python
guix shell: error: python-pyyaml: package not found for version 5.4.1
이 오류는 내 채널에서 이전 버전을 사용할 수 없기 때문에 발생합니다. 따라서 사용할 이전 버전 채널을 어떻게든 지정하는 것이 가능할 수도 있지만 방법은 모르겠습니다.
XY 문제의 측면 노드와 관련하여 이 문제의 직접적인 원인은 docker-compose가 이제 더 이상 작동하지 않는다는 것입니다.
$ guix shell docker-compose
guix shell: error: build of `/gnu/store/8qhvnw5mwra9i6ji24xlywcpdl0rdznn-docker-compose-1.29.2.drv' failed
$ zcat /var/log/guix/drvs/8q/hvnw5mwra9i6ji24xlywcpdl0rdznn-docker-compose-1.29.2.drv.gz
...checking requirements: ERROR: docker-compose==1.29.2 ContextualVersionConflict(PyYAML 6.0 (/gnu/store/igfl4023dzvl8vi6xs1m96lcsr4fdw07-python-pyyaml-6.0/lib/python3.9/site-packages), Requirement.parse('PyYAML<6,>=3.10'), {'docker-compose'})
그러나 나는 docker-compose에 대해 특별히 신경쓰지 않습니다. 오히려 이 질문은 이를 GUIX 기본 도구로 대체하려는 여정의 일부입니다.
(또한 pyyaml 6은 사용자에게 일부 보안 기능을 강제하므로 pyyaml 5는 더 이상 사용해서는 안 됩니다. pyyaml은 예시로만 사용됩니다.)
답변1
세 번째는 매력입니다. 하층민 목록을 사용하는 것이 가장 효과적인 것 같습니다.
info guix Inferiors
자세히보다. 정보페이지의 스냅샷입니다. (흥미롭게도 그들의 사용 사례는 내 사용 사례와 매우 유사합니다. 즉, 이전 버전의 yaml 라이브러리를 Python 인터프리터로 사용하는 대신 이전 버전의 json 라이브러리를 간계 인터프리터로 사용하는 것입니다.)
Note: The functionality described here is a “technology preview” as
of version 0.0-git. As such, the interface is subject to change.
Sometimes you might need to mix packages from the revision of Guix
you’re currently running with packages available in a different revision
of Guix. Guix “inferiors” allow you to achieve that by composing
different Guix revisions in arbitrary ways.
...
When combined with channels (*note Channels::), inferiors provide a
simple way to interact with a separate revision of Guix. For example,
let’s assume you want to install in your profile the current ‘guile’
package, along with the ‘guile-json’ as it existed in an older revision
of Guix—perhaps because the newer ‘guile-json’ has an incompatible API
and you want to run your code against the old API. To do that, you
could write a manifest for use by ‘guix package --manifest’ (*note
Invoking guix package::); in that manifest, you would create an inferior
for that old Guix revision you care about, and you would look up the
‘guile-json’ package in the inferior.
계속해서 예를 들어보겠습니다. 다음은 이 특정 사용 사례에 대한 동일한 예입니다.
$ cat mypyyamlmanifest.scm
(use-modules (guix inferior) (guix channels)
(srfi srfi-1))
(define channels
(list (channel
(name 'guix)
(url "https://git.savannah.gnu.org/git/guix.git")
(commit
;; The commit with the python-pyyaml 5.4.1
"d3e1a94391a838332b0565d56762a58cf87ac6b1"))))
(define inferior
(inferior-for-channels channels))
(packages->manifest
(list (first (lookup-inferior-packages inferior "python-pyyaml"))
(specification->package "python")))
$ guix shell -m mypyyamlmanifest.scm
...
$ python3 -c "import yaml; print(yaml.__version__)"
5.4.1
이 정보를 찾는 데 왜 그렇게 오랜 시간이 걸렸는지 생각해 보세요. (어쩌면 GUIX 개발자가 이 글을 읽고 내가 이를 사용하여 문서에 패치를 제공할 수도 있습니다.)
guix info guix package
이것이 체크리스트 사용의 출발점입니다. 설명에는 --manifest
목록을 만드는 방법에 대한 간단한 예가 있지만 토론 채널은 없습니다. --export-manifest
내가 만든 환경을 재현하는 방법을 배운 설명 링크가 있습니다.나의 첫 번째 대답. 섹션에서는 이 내보내기에 채널 정보가 포함되어 있지 않다고 설명하므로 매니페스트에 채널 정보가 전혀 포함되어 있지 않으며 두 번째 파일(나의 두 번째 대답). 설명은 바로 아래에 --export-manifest
링크되어 있는데 --export-channels
, 기존의 내용을 수정하는 중이었기 때문에 처음에는 읽지 않았습니다 channels.scm
. 그러나 자막의 필요성에 대한 설명으로 섹션이 끝납니다.
--manifest
설명 의 일부가 guix package
매니페스트에서 직접 채널을 정의하는 것일 수 있다면 이해하기가 더 쉬울 것입니다.
제가 올바르게 이해했다면 열등함은 기술적으로 채널과 다르기 때문에 위의 마지막 문장이 잘못되었으며 매니페스트에서 채널을 정의할 수 없습니다. 그러나 실제로는 매니페스트의 모든 패키지에 하위 패키지를 사용하여 매니페스트의 채널을 효과적으로 하드코딩하는 것이 가능해 보입니다. 이로 인해 매니페스트에서 직접 채널 사양을 허용하는 것이 더 간단한지 궁금합니다.
질문에 대한 답변에서 이 솔루션은 문제를 촉발한 원래 문제인 running 을 해결하기에는 여전히 충분하지 않습니다. 원래 채널의 솔루션이 여전히 사용되고 있기 docker-compose
때문입니다 . 가능한docker-compose
python-pyyaml
패키지가 열등한 입력을 사용하도록 허용modify-inputs
. 이렇게 하면 열악한 오래된 프로필을 docker-compose
사용 하고 나머지 프로필에서는 원래 채널의 최신 프로필을 사용할 수 있습니다 .python-pyyaml
python-pyyaml
답변2
훌륭한 info guix
페이지를 제공해 주셔서 감사합니다. 이것이 가능하다고 생각합니다.
guix shell \
--with-git-url=python-pyyaml="https://github.com/yaml/pyyaml.git" \
--with-branch=python-pyyaml="release/5.4.1" \
python-pyyaml python
하지만 이미 완벽한 패키지 정의가 있다면 약간 엉뚱한 느낌이 듭니다.https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/python-xyz.scm?h=d3e1a94391a838332b0565d56762a58cf87ac6b1#n3907.
pyyaml
매우 간단한 패키지 로 github에서 훌륭하게 호스팅되며 표준 git 분기 및 Python 설치 절차를 따릅니다. 그러나 일부 패키지는 더 복잡할 수 있으며 이러한 간단한 교체가 작동하지 않을 수 있습니다.
패키지에 사용할 채널 git url에 특정 커밋을 지정하는 방법이 있나요? (또는 완전한 guix shell
명령?)
편집: 이 솔루션이 좋지 않은 또 다른 이유는 다음과 함께 작동하지 않는다는 것입니다 --export-manifest
.
$ guix shell \
--with-git-url=python-pyyaml="https://github.com/yaml/pyyaml.git" \
--with-branch=python-pyyaml="release/5.4.1" \
--export-manifest \
python-pyyaml python > mymanifest.scm
$ guix shell -m mymanifest.scm
guix shell: error: the source of [email protected] is not a Git
그리고 mymanifest.scm
:
$ cat mymanifest.scm
;; What follows is a "manifest" equivalent to the command line you gave.
;; You can store it in a file that you may then pass to any 'guix' command
;; that accepts a '--manifest' (or '-m') option.
(use-modules (guix transformations))
(define transform1
(options->transformation
'((with-git-url
.
"python-pyyaml=https://github.com/yaml/pyyaml.git")
(with-branch . "python-pyyaml=release/5.4.1"))))
(packages->manifest
(list (transform1
(specification->package "python-pyyaml"))
(transform1 (specification->package "python"))))
답변3
이것은 아마도 GUIXy에 더 가깝습니다.
- 여전히 pyyaml 5.4.1이 있는 커밋에서 채널 파일을 만듭니다.
- 이 채널 파일에서 구성 파일을 만듭니다.
- 이 프로필을 활성화하세요.
- 필요한 패키지가 포함된 매니페스트를 만듭니다.
- 이 매니페스트를 사용하여 셸을 만듭니다.
$ cat mypyyamlchannels.scm
(list (channel
(name 'guix)
(url "https://git.savannah.gnu.org/git/guix.git")
(branch "master")
(commit
"d3e1a94391a838332b0565d56762a58cf87ac6b1")
(introduction
(make-channel-introduction
"9edb3f66fd807b096b48283debdcddccfea34bad"
(openpgp-fingerprint
"BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA")))))
$ guix pull -C mypyyamlchannels.scm -p mypyyamlprofile
$ GUIX_PROFILE="$(realpath mypyyamlprofile)"
$ . "$GUIX_PROFILE/etc/profile"
$ guix shell python-pyyaml python --export-manifest > mypyyamlmanifest.scm
$ cat mypyyamlmanifest.scm
;; What follows is a "manifest" equivalent to the command line you gave.
;; You can store it in a file that you may then pass to any 'guix' command
;; that accepts a '--manifest' (or '-m') option.
(specifications->manifest
(list "python-pyyaml" "python"))
$ guix shell -m mypyyamlmanifest.scm
그러나 여기에는 두 가지 단점이 있습니다.
- 내용이 좀 깁니다. 동일한 환경을 다시 생성하려면 2개의 파일(채널 및 매니페스트)과 4개의 명령(guix pull, set GUIX_PROFILE, 소스 구성 파일, guix Shell) 및 2개의 심볼릭 링크(
mypyyamlprofile
, ) 가 필요합니다 .mypyyamlprofile-1-link
작동하지 않는 변환 솔루션에는 매니페스트 파일 1개와 guix 쉘 명령 1개만 필요합니다. 채널과 매니페스트 파일을 하나로 결합한 다음 단일 명령으로 셸을 인스턴스화하는 데 사용할 수 있는 방법이 있습니까? - 메인 채널에서의 믹싱 및 매칭을 허용하지 않습니다. 믹싱을 위해서는 기본 채널을 결합하는 채널 파일을 생성한 다음 python-pyyaml 패키지에서 특정 커밋이 포함된 채널을 어떻게든 선택해야 한다고 생각합니다. 이로 인해 불일치가 발생할 수 있지만 해결이 가능할 수도 있습니다.
편집: 분명히 조잡한 것은 믹싱과 매칭을 더 쉽게 만들 것입니다.
Sometimes you might need to mix packages from the revision of Guix
you’re currently running with packages available in a different revision
of Guix. Guix “inferiors” allow you to achieve that by composing
different Guix revisions in arbitrary ways.