Guix
在 GUIX 中,如何使用舊版本的包,不再在頻道中?
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 "python-pyyaml@5.4.1" 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 (wrt this question)。如果有的話,這個問題是我用 GUIX 原生工具替換它的旅程的一部分。
(另外,我知道 pyyaml 6 會強制其使用者使用一些安全功能,因此不應再使用 pyyaml 5;pyyaml 僅用作範例。)
感謝出色的
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
如,
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 python-pyyaml@6.0 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"))))
這可能更 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 個清單文件和 1 個 guix shell 命令。有沒有辦法將通道和清單文件組合成一個單一的東西,然後可以用來在一個命令中實例化一個 shell?- 它不允許來自主通道的混合和匹配。我想混合需要創建一個通道文件來組合預設通道,然後以某種方式從具有特定送出的通道中挑選 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.