如何管理 R 包中的遗留依赖项?
How to manage legacy dependencies in a R package?
我正在开发依赖于 ReporteRs 库的包的分支。
但是,这个库已经被其所有者弃用了几年,取而代之的是 officer and flextable 库。
这种贬值的主要原因之一是不依赖于 rJava
,这可能会导致安装问题和错误。
在我的包裹中,我应该如何处理这种情况?
到目前为止,我的包正在将数据处理到 return 一个 ReporteRs
对象。如果我将函数更改为 return 一个 officer
对象,我将破坏向后兼容性。
但如果我不这样做,并保持旧的 ReporteRs
returning 功能作为遗留的向后兼容性功能,我必须在我的依赖项中保留 ReporteRs
,我的包会成为 rJava
依赖者。
有没有双赢的方案?
这是我会做的:
- 尽最大努力 re-implement 使用官员库的功能,但保留旧的 API。确保警告用户这些功能已被弃用。同时使新功能完全符合officer/flextable语法。请注意,您可以稍微更改函数的行为(例如,不确保正确评估所有参数),只要它们采用相同的参数和 return 相同类型的对象即可。
- 如果那真的不可能,只需为您的旧功能添加兼容性警告即可。
- 创建一个过渡包版本,您可以使用这些功能的两个版本保留几周或几个月。如果包还需要依赖rJava,那就倒霉了。
- 跟踪依赖于您的包裹的包裹。如果不是太多,你可以直接联系他们的开发者。也许问题没有你想象的那么严重?
编辑: 如上所述,您可以使对 ReportR
的依赖以 ReportR
的可用性为条件。然后,您可以将 ReportR
放入 DESCRIPTION 文件的 Suggests
字段而不是 Depends,并且在包中您可以使用这样的代码:
if(requireNamespace("ReportR")) {
warning("This function is deprecated, better use MyNewFunction instead")
ReportR::whatever() ...
} else {
warning("To run this (deprecated) function, please install the ReportR package")
}
我正在开发依赖于 ReporteRs 库的包的分支。
但是,这个库已经被其所有者弃用了几年,取而代之的是 officer and flextable 库。
这种贬值的主要原因之一是不依赖于 rJava
,这可能会导致安装问题和错误。
在我的包裹中,我应该如何处理这种情况?
到目前为止,我的包正在将数据处理到 return 一个 ReporteRs
对象。如果我将函数更改为 return 一个 officer
对象,我将破坏向后兼容性。
但如果我不这样做,并保持旧的 ReporteRs
returning 功能作为遗留的向后兼容性功能,我必须在我的依赖项中保留 ReporteRs
,我的包会成为 rJava
依赖者。
有没有双赢的方案?
这是我会做的:
- 尽最大努力 re-implement 使用官员库的功能,但保留旧的 API。确保警告用户这些功能已被弃用。同时使新功能完全符合officer/flextable语法。请注意,您可以稍微更改函数的行为(例如,不确保正确评估所有参数),只要它们采用相同的参数和 return 相同类型的对象即可。
- 如果那真的不可能,只需为您的旧功能添加兼容性警告即可。
- 创建一个过渡包版本,您可以使用这些功能的两个版本保留几周或几个月。如果包还需要依赖rJava,那就倒霉了。
- 跟踪依赖于您的包裹的包裹。如果不是太多,你可以直接联系他们的开发者。也许问题没有你想象的那么严重?
编辑: 如上所述,您可以使对 ReportR
的依赖以 ReportR
的可用性为条件。然后,您可以将 ReportR
放入 DESCRIPTION 文件的 Suggests
字段而不是 Depends,并且在包中您可以使用这样的代码:
if(requireNamespace("ReportR")) {
warning("This function is deprecated, better use MyNewFunction instead")
ReportR::whatever() ...
} else {
warning("To run this (deprecated) function, please install the ReportR package")
}