이것GUIX 하위 레벨설명서에는 다음과 같은 내용이 나와 있습니다.
따라서 일반 패키지를 삽입하는 거의 모든 위치(매니페스트, 운영 체제에서 선언한 패키지 필드 등)에 하위 패키지를 삽입할 수 있습니다.
그러나 패키지의 입력을 다시 작성할 때 Inferior를 사용하는 방법을 알 수 없습니다. 예를 들어 이 목록은 다음을 기반으로 합니다.매뉴얼의 패키지 변형 정의 섹션, 나에게는 작동하지 않습니다.
(use-modules (guix inferior) (guix channels) (guix packages)
(srfi srfi-1))
(use-package-modules docker)
(use-package-modules python-xyz)
(define mychannels
(list (channel
(name 'guix)
(url "https://git.savannah.gnu.org/git/guix.git")
;; Last commit that still has python-pyyaml 5.4.1.
(commit
"d3e1a94391a838332b0565d56762a58cf87ac6b1"))))
(define myinferior
(inferior-for-channels mychannels))
(define pyyaml5
(first (lookup-inferior-packages myinferior "python-pyyaml")))
(define pyyaml5-instead-of-pyyaml6
;; This is a procedure to replace pyyaml 6.0 by pyyaml 5.4.1.
;; The line below does not work, raises this error:
;; In procedure package-properties: Wrong type argument:
;; #<inferior-package [email protected] 7f42653831b0>
(package-input-rewriting `((,python-pyyaml . , pyyaml5)))
;; The line below does work (and has a similar result).
;(package-input-rewriting `((,python-pyyaml . , python-pyyaml-for-awscli)))
)
(define docker-compose-with-pyyaml5
(pyyaml5-instead-of-pyyaml6 docker-compose))
(packages->manifest
(list pyyaml5
(specification->package "python")
docker-compose-with-pyyaml5
))
docker-compose
5.4.1 에서만 사용 가능하며 python-pyyaml
, 채널 버전이 6.0으로 업그레이드되었습니다. 그래서 제가 시도한 재작성은 채널의 이전 버전에서 5.4.1을 docker-compose
사용 하도록 입력을 재작성하는 것이었습니다 . python-pyyaml
그러나 내 시도는 실패했습니다.
Backtrace:
In guix/packages.scm:
1269:17 19 (supported-package? #<package [email protected] gu…> …)
In guix/memoization.scm:
101:0 18 (_ #<hash-table 7fa05e6274c0 152/223> #<package docker…> …)
In guix/packages.scm:
1247:37 17 (_)
1507:16 16 (package->bag _ _ _ #:graft? _)
1608:48 15 (thunk)
1403:25 14 (inputs _)
In srfi/srfi-1.scm:
586:29 13 (map1 (("python-cached-property" #<package python-…>) …))
586:29 12 (map1 (("python-distro" #<package python-distro@1.…>) …))
586:29 11 (map1 (("python-docker" #<package python-docker@5.…>) …))
586:29 10 (map1 (("python-dockerpty" #<package python-docker…>) …))
586:29 9 (map1 (("python-docopt" #<package python-docopt@0.…>) …))
586:29 8 (map1 (("python-dotenv" #<package python-dotenv@0.…>) …))
586:29 7 (map1 (("python-jsonschema" #<package python-jsons…>) …))
586:17 6 (map1 (("python-pyyaml" #<package python-pyyaml@6.…>) …))
In guix/packages.scm:
1360:20 5 (rewrite ("python-pyyaml" #<package [email protected]…>))
In guix/memoization.scm:
101:0 4 (_ #<hash-table 7fa06ac0b540 8/31> #<package python-py…> …)
In guix/packages.scm:
1377:22 3 (_)
1435:37 2 (loop #<inferior-package [email protected] 7fa06304b3…>)
In ice-9/boot-9.scm:
1685:16 1 (raise-exception _ #:continuable? _)
1685:16 0 (raise-exception _ #:continuable? _)
ice-9/boot-9.scm:1685:16: In procedure raise-exception:
In procedure package-properties: Wrong type argument: #<inferior-package [email protected] 7fa06304b3f0>
열등한 입력으로 어떻게 다시 작성할 수 있습니까?
python-pyyaml
이제 채널에 5.4.1이라는 이름이 있는 것 같습니다 python-pyyaml-for-awscli
. 해당 패키지를 사용하여 입력 다시 쓰기는 docker-compose
예상대로 작동하므로 입력을 다시 작성할 때 올바른 구문을 사용하고 있다고 알 수 있습니다. (백틱, 점, 쉼표가 무엇을 하는지 잘 모르겠습니다. 아마도 거기에 버그가 있을 수도 있습니다.)
(XY 문제의 경우 docker-compose
Run now 를 사용할 수 있지만 python-pyaml-for-awscli
다음에 사용 가능한 패키지가 없을 수도 있으므로 Inferior를 사용하는 방법에 여전히 관심이 있습니다.)
답변1
아직 GUIX 1.3.0에는 없는 기능이 있는 것 같은데 modify-inputs
, 연결할 수 있는 "야간" 온라인 문서가 있는지는 모르겠습니다.
이것은 작동합니다:
(use-modules (guix inferior) (guix channels) (guix packages)
(srfi srfi-1))
(use-package-modules docker)
(use-package-modules python-xyz)
(define mychannels
(list (channel
(name 'guix)
(url "https://git.savannah.gnu.org/git/guix.git")
;; Last commit with pyyaml 5.4.1.
(commit
"d3e1a94391a838332b0565d56762a58cf87ac6b1"))))
(define myinferior
(inferior-for-channels mychannels))
(define pyyaml5
(first (lookup-inferior-packages myinferior "python-pyyaml")))
(define (also-pyyaml5-instead-of-pyyaml6 apackage)
;; This is a procedure to replace pyyaml 6.0 by pyyaml 5.4.1.
(package
(inherit apackage)
(inputs
(modify-inputs (package-inputs apackage)
(replace "python-pyyaml" pyyaml5)))))
(define also-docker-compose-with-pyyaml5
(also-pyyaml5-instead-of-pyyaml6 docker-compose))
(packages->manifest
(list python-pyyaml
(specification->package "python")
also-docker-compose-with-pyyaml5))
이제 docker-compose
버전 5.4.1을 사용하면 python-pyyaml
구성 파일의 나머지 부분은 6.0을 사용합니다.
package-input-rewriting
를 사용하여 하위를 사용할 수 있는지는 아직 모르겠지만 modify-inputs
using 을 사용하면 동일한 효과를 얻을 수 있으며 작동합니다.