【问题标题】:Enforce upper bound for R Package version dependency强制 R 包版本依赖的上限
【发布时间】:2021-11-18 04:15:59
【问题描述】:

在开发 R 包时,我们使用DESCRIPTION 文件列出包依赖项(例如,在“导入”部分中),并且我们可以通过后缀指定每个包依赖项所需的最小版本与“(> = x.x.x)”。但是,指定最大版本的类似功能是什么?

一些上下文

有时,我们所依赖的外部包在发布时带有重大更改,这些更改可能不再与正在开发的包兼容。每次使用重大更改更新外部包时更新我们的包是不可持续的。

示例

假设我正在开发一个名为“MarksPackage”的 R 包,它依赖于“dplyr”。到目前为止,我构建的所有内容都适用于 dplyr v1 的当前状态。但是,明天 dplyr v2 将发布 重大更改,这些更改会影响我的包。对于正在安装我的软件包的新用户,可能已经安装了最新的 dplyr v2,因此 MarksPackage 对他们不起作用。 每次 dplyr 通过重大更改更新时,我不一定想要或能够去更新我的包。我宁愿指定一个最大版本,甚至是一个版本范围,我知道 MarksPackage 可以工作。

如何在说明文件中完成此操作?有没有这样的语法:

Package: MarksPackage
Imports: 
    dplyr (>= 0.8.5 & <=1.2.0),
    dbplyr,
    tidyr (<= 1.0.2)

【问题讨论】:

  • 我认为一般来说较新的软件包不应该损坏。这就是该测试的目的,声明为已弃用等,不是吗?如果有重大更改,更改您的包(例如删除依赖项)是恕我直言的方法。
  • 我同意@KarstenW。关于最佳实践;你应该与时俱进。但是,我对下面问题的技术“如何”部分有一个答案,而没有涉及“应该”部分(你应该做什么)
  • @KarstenW。我知道你来自哪里,我通常同意。然而,我们的组织有一种有趣的工作方式,虽然这可能不是最佳实践,但我们在一个特定的实例中需要这种能力(因此我尝试用我的上下文部分来证明它的合理性)。例如,我们大致知道,一旦我们内部开发了这个包,它就不会再被触及,所以我真的希望它是“设置它并忘记它”,并保证它对未来的用户来说会一清二楚如何创建一个可以保证工作的环境。

标签: r r-package


【解决方案1】:

当您对 R 扩展包的工作方式有任何疑问时,您应该查阅 Writing R Extensions 手册。 这里特别要Section 1.1.3, Package Dependencies,相关部分有说明

“Depends”字段给出了这个包所依赖的包名的逗号分隔列表。当调用 library 或 require 时,这些包将附加在当前包之前。每个包名称可以选择后跟括号中的注释,指定版本要求。注释应包含比较运算符、空格和有效的版本号,例如“质量 (>= 3.1-20)”。

...

一个包或“R”可以在“Depends”字段中出现多次,例如给出可接受版本的上限和下限。

所以,对于你的例子,你会这样做

Package: MarksPackage
Imports: 
    dplyr (>= 0.8.5),
    dplyr (<= 1.2.0),
    dbplyr,
    tidyr (<= 1.0.2)

【讨论】:

  • 谢谢!这正是我在文档中错过的。我希望这已经进入了哈德利的书籍……我几乎从不参考原始文档
  • 是的,公平地说@mkirzon 那些原始文档非常冗长,其中大部分不适用于您在任何特定时间需要的内容,所以我不能完全责怪您没有通读它们。但是,现在已经阅读了手册的(大部分)部分几次,我实际上会说,令人惊讶的是,在某些时候这样做是非常值得的
猜你喜欢
  • 2022-07-08
  • 2020-04-18
  • 1970-01-01
  • 2019-01-11
  • 2020-02-02
  • 2015-11-22
  • 2017-04-14
  • 2019-12-29
  • 1970-01-01
相关资源
最近更新 更多