构建R包时出现警告信息:无效的uid值被替换为用户“nobody”的值。

39

我正在使用R CMD build ABC构建R包时,收到了以下警告信息:

* building ‘milonga_1.0.tar.gz’
Warning: invalid uid value replaced by that for user 'nobody'

我不知道这是什么意思。能否有人给一个简短的解释吗?


3
通常情况下,这个页面现在是谷歌上的热门搜索结果,前面的评论看起来有些愚蠢。 - rsoren
2个回答

43

我经常遇到这个问题。简而言之,你可以忽略它,这与tar文件不能可移植地允许用户ID大于32767有关,但某些系统上的用户ID大于此值。

Winston Chang的Github R源代码镜像中搜索代码,可以找到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))
 }

这里有一个参考bug报告的链接,以及在devtools问题列表中的其他讨论

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

  

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

维基百科说:

  

POSIX要求UID为整数类型。大多数类Unix操作系统将UID表示为无符号整数。UID值的大小因不同系统而异;一些UNIX OS [哪些?] 使用了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只能存储到'nobody'(通常为32767)的uid,而且大于该范围的将无法在其他工具上移植。尽管先前没有出现警告,但生成的tarball可能会在使用其他工具解压缩时引起问题。

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


2
谢谢,@Ben!比我从谷歌搜索得到的信息更有帮助。 - David Z
1
在你的 ~/.Renviron 文件中设置 R_BUILD_TAR=tar 可能会消除这些警告,因为它将使用比 R 自身内置的更现代的 tar 工具。有关详细信息,请参见我的完整答案(下文)。 - HenrikB
CRAN会允许我们“忽略”这个警告吗? - Jessica Burnett
我相信是这样的。我一直都可以忽略它(并且已经提交了多个软件包到CRAN)。 - Ben Bolker

12

为了进一步澄清Ben Bolker的精准解释并提供解决方法,这仅适用于uidgid大于32767的用户,例如。

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

$ id --group
900     # <= OK

当使用utils::tar()时,会出现此警告,并使用内置的tar函数,默认情况下是这样。警告是在内部函数中产生的。这些警告最常见的原因是我们构建R包的时候,例如:R CMD build pkgname

不容易发现,但从help("build", package="utils")中可以了解到,可以通过环境变量R_BUILD_TAR覆盖内部tar函数。因此,对于Linux和macOS上的用户,请设置:

R_BUILD_TAR=tar

在你的~/.Renviron文件中添加以下内容。这将使R CMD build使用你PATH上的tar工具,并且很可能该tar工具将接受大于32767的UID和GID。例如,对于CentOS 7附带的tar工具来说是这样的:

$ tar --version | head -1
tar (GNU tar) 1.26

PS. help("build", package="utils") 还提到了 R_INSTALL_TAR。当使用 R CMD check (sic!) 时,它似乎会发挥作用,因此我不确定设置它是否明智。例如,当您在本地检查软件包时,在 tarballs 中出现过长的文件名时,您可能不会收到警告,但当您提交到 CRAN 时将失败。


2
使用 R_BUILD_TAR=tar --format=gnu 命令来抑制 "Warning in untar2(tarfile, files, list, exdir, restore_times) : using pax extended headers" 警告。 - bers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接