我正在开发一个支持与替代形状的库结构交互的包,该库结构支持并行安装包的多个版本(RVClibrary,即将在CRAN上安装)。最近,我遇到了一些奇怪的行为,希望有人能解释一下。
安装软件包时,它有时可能具有比二进制版本更高的源版本。在这种情况下,源代码(未编译的 C 代码)尚未编译(由...?),但包含比已编译的二进制版本更高的版本。在我的案例中显示了以下内容:
There is a binary version available but the source version is later:
binary source needs_compilation
rlang 0.2.0 0.3.4 TRUE
用户可以选择是应该相对安装还是编译 A 或 B。换句话说,如果你想要版本 0.2.0 或 0.3.4(你需要 Rtools)。
设置install.packages.compile.from.source
选项时,不会提供此选项。
> options(install.packages.compile.from.source = "always")
> install.packages('rlang', lib = "C:\test", quiet = TRUE, repos = "http://cran.us.r-project.org")
There is a binary version available but the source version is later:
binary source needs_compilation
rlang 0.2.0 0.3.4 TRUE
installing the source package ‘rlang’
源已安装。
但是当我创建一个简单的脚本(我将其命名为install_test.R
):
packageName <- commandArgs(trailingOnly = TRUE)[1]
cat(packageName, 'n')
options(install.packages.compile.from.source = "always")
install.packages(packageName, lib = "C:\test", quiet = TRUE, repos = "http://cran.us.r-project.org")
以下行为与 R 中的系统相同,直接在 CMD 中也是如此(
确保在环境变量 PATH 中具有Rscript.exe
路径)
> system("Rscript.exe C:\test\install_test.R rlang")
rlang
There is a binary version available but the source version is later:
binary source needs_compilation
rlang 0.2.0 0.3.4 TRUE
Binaries will be installed
package 'rlang' successfully unpacked and MD5 sums checked
二进制文件已安装!
我需要能够始终安装源版本,这样我就不会遇到依赖问题。 例如,ggplot2 已经依赖于>= 0.2.1
...
总结
- 我安装了 Rtools 3.5(devtools 可以使用两种路由找到它并认为它不兼容......,但从源代码安装在 Rstudio 中工作正常,并且 (https://cran.r-project.org/bin/windows/Rtools/) CRAN 说它兼容)
- R 版本:
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
year 2016
month 06
day 21
svn rev 70800
language R
version.string R version 3.3.1 (2016-06-21)
nickname Bug in Your Hair
- 运行视窗 10
- 环境变量之间的差异可以在这里看到(Rstudio在右边,Rscript在左边): https://pasteboard.co/IasIVMe.png
(我在这里的编辑被删除以保持干净。请参阅我的答案(或历史记录)以阅读更多)
我尝试了不同的环境变量配置,以查看是否可以由运行install.packages
的Rscript.exe 实例执行从源代码安装/编译。
(从 Rstudio 控制台工作时,它的工作方式不同(限制较少)。它似乎识别注册表项。它根本不指定环境变量即可工作)。
- 设置变量
MAKE
(Sys.setenv(MAKE = 'C:\Rtools\bin\make.exe')
) (部分成功) - 设置变量
PATH
(附加到开头)- 包括所有 Rtools bin dirs (
C:\Rtools\bin;C:\Rtools\mingw_32;C:\Rtools\mingw_64
) (成功) - 仅包括工具
C:\Rtools\bin
(成功) - 仅包含 Rtools
C:\Rtools\bin
(到 PATH 变量的末尾) (成功) - 仅包括 Rtool
C:\Rtools\mingw_32
(失败) - 仅包含 Rtools
C:\Rtools\mingw_64
(失败)
- 包括所有 Rtools bin dirs (
- 仅设置
PATH
,而不设置MAKE
变量。
在设置以下属性的条件下:options(install.packages.compile.from.source = "always")
解决方案 1:install.packages
函数通过查找"MAKE"环境变量nzchar(Sys.which(Sys.getenv("MAKE", "make")))
来"检查"是否应该尝试从源代码构建。不幸的是,如果您只指定 MAKE 环境变量,您必须提供完整的路径才能使其(Sys.which
)工作,它仍然找不到所有必需的源构建工具(Rtools/bin),这些工具似乎是必要的,并且在没有任何澄清的情况下崩溃:
> Sys.setenv(MAKE = 'C:\Rtools\bin\make.exe')
> system("Rscript.exe C:\R_projecten\test\install_test.R rlang")
There is a binary version available but the source version is later:
binary source needs_compilation
rlang 0.2.0 0.3.4 TRUE
installing the *source* package 'rlang'
Warning messages:
1: running command '"C:/PROGRA~1/R/R-33~1.1/bin/x64/R" CMD INSTALL -l "C:R_projectentesttest4" C:UsersSB947~1.FROAppDataLocalTempRtmpwbEcl6/downloaded_packages/rlang_0.3.4.tar.gz' had status 1
2: In install.packages(packageName, lib = "C:\R_projecten\test\test4", :
installation of package 'rlang' had non-zero exit status
所以解决方案 1 是不够的,甚至可以用解决方案 3 代替:
PATH : C:Program FilesRR-3.3.1binx64; .... ;C:Rtoolsbin;
MAKE :
There is a binary version available but the source version is later:
binary source needs_compilation
rlang 0.2.0 0.3.4 TRUE
installing the source package 'rlang'
如图所示,仅在 PATH 中提供C:/Rtools/bin
,没有 MAKE 变量就足够了。
该检查描述了先前检查 MAKE 变量是否存在并使用该值,否则它将查找程序名称(默认为Sys.getenv
make
)。仅指定 PATH 时,可以找到make(.exe)
文件,并且不需要 MAKE env var。额外的好处是已经指向显然需要更多文件的 Rtools/bin 目录。
我仍然想知道哪些文件...
注意:检查nzchar(Sys.which(Sys.getenv("MAKE", "make")))
不足以证明您的环境已准备好从源代码构建。