构建R包期间的警告消息:无效的uid值被用户'nobody'替换

Dav*_*d Z 18 r

我正在构建一个R包使用R CMD build ABC并收到此警告消息:

* building ‘milonga_1.0.tar.gz’
Warning: invalid uid value replaced by that for user 'nobody'
Run Code Online (Sandbox Code Playgroud)

我不知道这意味着什么.有人会有简短的解释吗?

Ben*_*ker 28

我总是得到这个.tl; dr你可以忽略它,它必须解决tar文件无法允许用户ID大于32767的问题,但某些系统上的用户ID大于此值.

搜索Winston Chang的R源代码树的Github镜像代码在src/library/utils/R/tar.R中找到此代码:

 uid <- info$uid
 ## uids are supposed to be less than 'nobody' (32767)
 ## but it seems there are broken ones around: PR#15436
 if(!is.null(uid) && !is.na(uid)) {
      if(uid < 0L || uid > 32767L) {invalid_uid <- TRUE; uid <- 32767L}
      header[109:115] <- charToRaw(sprintf("%07o", uid))
 }
Run Code Online (Sandbox Code Playgroud)

(这里是引用的错误报告和关于devtools问题列表的其他讨论的链接).

查看/etc/passwd我的系统显示我有用户ID 56347.

bolker:x:56347:1001:Ben Bolker ,,,,:/ home/bolker:/ bin/bash

维基百科说

POSIX要求UID是整数类型.大多数类Unix操作系统将UID表示为无符号整数.UID值的大小因系统而异; 一些UNIX操作系统[哪个?]使用15位值,允许值高达32767,而其他如Linux支持16位UID,使得65536个唯一ID成为可能.大多数现代类Unix系统已经切换到32位UID,允许4,294,967,296(232)个唯一ID.

和

为了兼容16位和32位UID,许多Linux发行版现在将其设置为2 ^ 16-2 = 65,534; 当32位UID不适合16位系统调用的返回值时,Linux内核默认返回此值.[11]

Brian Ripley说

tarball只能存储uid到'nobody'(通常是32767),当然更大的不能解压缩.警告之前没有发生过,但是在使用其他工具打开包装时产生的tarball可能会导致问题.

我找不到更多关于此的文档(除了维基百科说有Unix系统有15位uid).在GNU焦油页似乎给uid作为长度-8 字符类型...

  • 谢谢,@ Ben!比谷歌搜索更有用的信息. (2认同)
  • 在“~/.Renviron”中设置“R_BUILD_TAR=tar”很可能会消除这些警告,因为它将使用比 R 本身内置的工具更现代的 tar 工具。有关详细信息,请参阅我的完整答案(如下)。 (2认同)

Hen*_*ikB 5

为了进一步澄清 Ben Bolker 的现场解释并提供解决方法,这仅适用于拥有uid或gid大于 32767 的用户,例如

$ id --user
60839   # <= causes the warning

$ id --group
900     # <= OK
Run Code Online (Sandbox Code Playgroud)

当utils::tar()使用并使用内部内置 tar 函数时会发生此警告,这是默认设置。正是在该内部函数中产生警告。这些警告的最常见原因是当我们构建R 包时,例如R CMD build pkgname.

不容易找到,但help("build", package="utils")可以看出内部 tar 函数可以被环境变量覆盖R_BUILD_TAR。因此,对于 Linux 和 macOS 上的用户,请设置:

R_BUILD_TAR=tar
Run Code Online (Sandbox Code Playgroud)

在您的~/.Renviron. 这将导致在您的tar 工具上R CMD build使用并且很可能会接受大于 32767 的 UID 和 GID。例如,CentOS 7 附带的 tar 工具就是这样:tarPATH

R_BUILD_TAR=tar
Run Code Online (Sandbox Code Playgroud)

附注。help("build", package="utils")还提到R_INSTALL_TAR。这似乎在使用R CMD check(原文如此!)时起作用,所以我不确定设置它是否明智。例如,当你在本地检查你的包时,你可能不会收到关于 tarball 中太长文件名的警告,但当你提交给 CRAN 时会失败。

  • 使用 `R_BUILD_TAR=tar --format=gnu` 来抑制“untar2(tarfile, files, list, exdir, Restore_times) 中的警告:使用 pax 扩展标头”。 (2认同)