Guix

在 GUIX 中,如何使用舊版本的包,不再在頻道中?

  • April 15, 2022

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

但是,如果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 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 個符號連結(mypyyamlprofilemypyyamlprofile-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.

引用自:https://unix.stackexchange.com/questions/698811