如何在Guile Scheme中打开相对于源文件目录的文件?



我正在为我正在工作的Python项目编写一个Guix开发人员环境定义,它看起来像这样:

(use-modules (gnu packages)
(gnu packages python)
(gnu packages python-crypto)
(gnu packages python-web)
(gnu packages python-xyz)
(ice-9 rdelim)
((guix licenses) #:prefix license:)
(guix build-system python)
(guix download)
(guix packages))
(define (requirements-file->guix-packages filename)
(let* ((requirements-text (with-input-from-file filename read-string))
(requirements-list (string-split requirements-text #newline)))
(map (lambda (requirement)
(specification->package (string-append "python-" requirement)))
requirements-list)))
(define internsidor-deps      (requirements-file->guix-packages "requirements.in"))
(define development-tools     (list python-pip python-wrapper python-virtualenv python-jedi))
(append internsidor-deps development-tools)

现在,如果在项目文件夹的根目录(requirements.inrequirements-prod.in所在的位置)评估这段代码,则可以正常工作。但如果用户移动到子文件夹并运行类似

的代码
guix environment --ad-hoc --load='../development-environment.scm'

他们会发现自己出现以下错误

guix environment: error: while evaluating '../development-environment.scm', it failed opening 'requirements.in' with the error: No such file or directory

(或者沿着这些行出现错误,我已经修改了我的Guix,以便为此失败提供更好的错误消息。)

所以我的问题是:我如何修改对with-input-from-file的调用,使路径相对于Scheme文件而不是shell的$PWD?

您可以使用(dirname (current-filename))获取当前文件的目录。参见https://www.gnu.org/software/guile/manual/guile.html#Source-Properties

最新更新