我正在使用R CMD build ABC
构建R包时,收到了以下警告信息:
* building ‘milonga_1.0.tar.gz’
Warning: invalid uid value replaced by that for user 'nobody'
我不知道这是什么意思。能否有人给一个简短的解释吗?
我正在使用R CMD build ABC
构建R包时,收到了以下警告信息:
* building ‘milonga_1.0.tar.gz’
Warning: invalid uid value replaced by that for user 'nobody'
我不知道这是什么意思。能否有人给一个简短的解释吗?
我经常遇到这个问题。简而言之,你可以忽略它,这与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】
tarball只能存储到'nobody'(通常为32767)的uid,而且大于该范围的将无法在其他工具上移植。尽管先前没有出现警告,但生成的tarball可能会在使用其他工具解压缩时引起问题。
我找不到更多关于此的文档(除了维基百科说有15位uid的Unix系统存在)。 GNU tar页面似乎给出了uid
作为长度为8的字符类型...
~/.Renviron
文件中设置 R_BUILD_TAR=tar
可能会消除这些警告,因为它将使用比 R 自身内置的更现代的 tar 工具。有关详细信息,请参见我的完整答案(下文)。 - HenrikB为了进一步澄清Ben Bolker的精准解释并提供解决方法,这仅适用于uid
或gid
大于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 时将失败。
R_BUILD_TAR=tar --format=gnu
命令来抑制 "Warning in untar2(tarfile, files, list, exdir, restore_times) : using pax extended headers" 警告。 - bers