【问题标题】:Where does the $*REPO dynamic variable obtain its values, and how to change/alter them?$*REPO 动态变量在哪里获取其值,以及如何更改/更改它们?
【发布时间】:2023-03-14 15:15:01
【问题描述】:

这个问题是对找出this error(以zef error开头)为什么会出现的补充。

显然,在某些情况下,可从$*REPO 访问的存储库链可能会有所不同。即,在GitHub action such as this one, where raku is part of a Docker image 中,存储库链突然变为:

(inst#/github/home/.raku inst#/usr/share/perl6/site inst#/usr/share/perl6/vendor inst#/usr/share/perl6/core ap# nqp# perl5#)

第一个目录实际上并不存在;这应该是/home/raku/.raku。有几个问题

  1. 为什么 rakudo 将那个不存在的目录安装为存储库链的一部分
  2. 是否有任何解决方法可以简单地将该值更改为正确的值?

我真的不明白发生这种情况的原因是什么。初始化容器涉及一个长的命令行,如下所示:

/usr/bin/docker create --name d043d929507d4885927ac95002160d52_jjmereloalpinerakugha202110_1e6e32 --label 6a6825 --workdir /__w/p6-pod-load/p6-pod-load --network github_network_da048828784a46c3b413990beeaed866  -e "HOME=/github/home" -e GITHUB_ACTIONS=true -e CI=true -v "/var/run/docker.sock":"/var/run/docker.sock" -v "/home/runner/work":"/__w" -v "/home/runner/runners/2.285.1/externals":"/__e":ro -v "/home/runner/work/_temp":"/__w/_temp" -v "/home/runner/work/_actions":"/__w/_actions" -v "/opt/hostedtoolcache":"/__t" -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" --entrypoint "tail" jjmerelo/alpine-raku:gha-2021.10 "-f" "/dev/null"

在哪里,实际上似乎有一个环境变量设置为该值。因此,可能是环境变量HOME 决定了这一点,而不是安装中发生的任何事情。但我不知道这是一个功能,还是一个错误。

【问题讨论】:

  • @JJ .@ugexe 的回答是否完全解决了您问题的第二部分?如果没有,请评论缺少的内容。谢谢。
  • @raiph 我知道你喜欢这样的问题来获得答案,但它并没有真正解决第二部分。答案就在这里:github.com/JJ/alpine-raku/blob/master/github-actions.Dockerfile,这不是一种解决方法,它只是一种让 Rakudo 使用 `RAKULIB. 查看特定目录的方法。我会更新答案以反映这一点。
  • @JJ 谢谢。 FWIW你误解了我的意图。我已经阅读了 cmets 并且无法判断您是否忘记接受 .@ugexe 的回答,或者它是否未能完全解决您 Q 的某些部分,或者您是否只是没有时间来更新/接受您的一个完全解决您的问题的答案,或者如果还没有一个好的答案,或者......?如果我不能说,其他人可能在同一条船上,这对 raku、搜索者、读者、回答者或提问者都不利。当我看到提问者没有澄清它是什么的 Q 时,我会考虑让他们发表评论。 FWIW 我仍然不确定。
  • @raiph 我知道这是其中之一,非常感谢您抽出宝贵时间这样做。

标签: raku rakudo


【解决方案1】:

您需要将 RAKULIB 设置为最初安装库的位置,就像 here 所做的那样:

# Environment
ENV PATH="${WORKDIR}/.raku/bin:${WORKDIR}/.raku/share/perl6/site/bin:${PATH}" \
    ENV="${WORKDIR}/.profile"\
    RAKULIB="inst#/home/raku/.raku"

这部分文档不足,但inst# 前缀反映了它包含预压缩单元的事实,并且该目录是它最初安装的位置。因此,无论HOME 在哪里,Rakudo 都会找到原来安装的模块。


原答案

我没有第二部分的答案,但我可以回答第一部分:每次启动 rakudo 时,存储库链中的第一个元素都取自 $HOME。如果在安装zef 或任何其他模块时$HOME 的值与当前的不同(例如),则一种解决方法是

HOME=/home/raku zef --version

如果您不想以这种方式携带变量,也许可以创建一个 shell 函数或别名。长期解决方案,真的不知道。

【讨论】:

    【解决方案2】:

    为什么 rakudo 将那个不存在的目录安装为存储库链的一部分

    因为您将$HOME 设置为该目录。不出所料,home 存储库引用了$HOME

    是否有任何解决方法可以简单地将该值更改为正确的值?

    这不需要解决,而是需要正确设置您的环境。看来您将 $HOME 更改为一个不存在的目录,尝试让 zef 隐式安装到这个新目录(即使它确实存在,如果没有您这样做,它也可能没有权限),当失败时您明确安装到 /home/raku 并想知道为什么带有 /github/home 主目录/repo 的 raku 环境没有在 /home/raku 中查找(以及它怎么可能?)。我的建议是在设置新的$HOME 目录时找出文件权限问题。

    【讨论】:

    • 你为什么把答案的最后一部分删掉了?
    • .@MustafaAydın 提到的半句是关于小心不要给人们留下“设置RAKULIB”的印象。 JJ 刚刚为这个 Q 做出了公认的答案。他对我的评论做出了改变,目的是让我们所有人都清楚地了解他的 Q 的一个好的答案。他误解了它,我怀疑他感到有压力去做某事除了评论。目前,我不清楚你们现在是否同意他的回答对于他在 Q 中描述的特定情况是一个很好的回答。任何澄清的评论将不胜感激。
    • 我不同意按照建议设置 rakulib(到另一个用户的主目录)是一个好主意。 inst# 的描述也不是关于预编译的任何内容。对我来说,接受的答案似乎被误解了,但碰巧有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2019-07-21
    • 2022-01-11
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多