【问题标题】:Use renv for private GitLab package将 renv 用于私有 GitLab 包
【发布时间】:2020-10-27 13:37:36
【问题描述】:

我有一个本地 GitLab 帐户,其中包含可以通过以下方式安装的 R 包:

devtools::install_git( 
  url = "http://my-gitlab/my-projects/package",
  credentials = git2r::cred_user_pass("user", "pass")
)

当我运行renv::init() 时,包源未知。 getting started article 确实提供了有关如何设置函数以处理私有存储库的详细信息,但在使用 devtoolsgit2r::cred_user_pass 时,我无法为 GitLab 弄清楚。我可以将GIT_USERGIT_PASSWORD 存储在.Renviron 文件中,但我不确定如何使用这些凭据将init 函数强制给用户devtools::install_git。我确实尝试过,但后来出现错误:

fatal: could not read Username for 'http://my-gitlab': No such device or address

他们提供的所有示例选项都使用 GitLab 令牌进行身份验证:

# use a named list directly
options(renv.auth = list(
  MyPackage = list(GITHUB_PAT = "<pat>")
))

也许有更好的方法可以从本地 GitLab 存储库安装,与 renv 一起使用会更好?

【问题讨论】:

    标签: r gitlab devtools install.packages renv


    【解决方案1】:

    当我运行 renv::init() 时,包源是未知的。

    renv 根据其DESCRIPTION 文件推断包的来源,该文件(对于自定义遥控器)通常由安装函数本身进行事后注释。我怀疑install_git() 没有以renv 预期的方式之一注释包,因此renv 无法推断包源。

    您可以尝试通过检查DESCRIPTION 文件来确认这一点;例如转储其内容的快速方法是:

    writeLines(readLines(system.file("DESCRIPTION", package = <package>)))
    

    并检查 RemoteType: git 之类的字段,以查看包源是否确实已被注释。


    对于它的价值,它看起来像 devtools::install_git() 委托给 remotes::install_git(),并且可以通过 remotes.git_credentials 选项设置默认的 Git 凭据。例如:

    options(remotes.git_credentials = git2r::cred_user_pass("user", "pass"))
    

    不过,renv 最终还是依赖于使用私有访问令牌(通过 GitLab 的 GITLAB_PAT 环境变量访问)来通过私有存储库进行身份验证。

    您是否能够使用renv::install()GITLAB_PAT 设置成功安装软件包?例如:

    Sys.setenv(GITLAB_PAT = <...>)
    renv::install("gitlab::user/project")
    

    这是我推荐的工作流程,也应该得到开箱即用的 remotes / devtools 软件包的支持。

    【讨论】:

    • 我看到RemoteType: git2r。在设置GITLAB_PAT 后尝试使用renv::install 安装时出现错误:download failed [error code 22]。我不确定使用什么路径。我的包裹网址是my-gitlab-server/r-projects/package.git。在那种情况下,用户会是r-projects吗?我将如何传递服务器地址?
    • 我也试过了:renv::install("gitlab::server/my_user_name/package") 但我得到了同样的错误。
    • 在这一点上,我认为我建议在github.com/rstudio/renv/issues 提交问题,因为这可能需要比 Stack Overflow 更适合的后续工作(希望我们可以在找到后更新答案决议)
    【解决方案2】:

    对于遇到同样问题的其他人,这对我有用(请参阅here):

    • 在 GITLAB 中创建 PAT,确保将 SCOPE 设置为 api。注意:我不确定这一定是 'api' 我没有检查所有选项,但它对我有用
    • 使用Sys.setenv(GITLAB_PAT = &lt;...&gt;)将PAT设置为环境变量
    • 使用options(renv.config.gitlab.host = "http://my-gitlab-server") 将gitlab 主机服务器设置为选项。注意:我必须包含“http://”才能使其正常工作。
    • 运行renv::install("gitlab::project/package")
    • 这对我不起作用:renv::install("gitlab@my-gitlab-server::project/package")

    【讨论】:

      猜你喜欢
      • 2018-02-20
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多