我正在开发一个支持与一个交替形状的库结构交互的包,它支持并行安装多个版本的包(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
已...
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
(我的编辑在这里删除以保持清洁。请参阅我的答案(或历史)阅读更多)
我尝试了不同的环境变量配置,以查看是否可以通过运行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
)(SUCCEEDS)
仅包括Rtools C:\\Rtools\\bin
(SUCCEEDS)
仅包含Rtools C:\\Rtools\\bin
(到PATH变量的末尾)(SUCCEEDS)
仅包括Rtools C:\\Rtools\\mingw_32
(FAILS)
仅包括Rtools C:\\Rtools\\mingw_64
(FAILS)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_projecten\test\test4" C:\Users\SB947~1.FRO\AppData\Local\Temp\RtmpwbEcl6/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 Files\R\R-3.3.1\bin\x64; .... ;C:\Rtools\bin;
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变量是否存在,并使用该值,否则它将查找程序名称make
(默认提供给Sys.getenv
)。仅指定PATH时,可以找到make(.exe)
文件,并且不需要MAKE env var。具有额外的好处,已经指向Rtools / bin目录,显然需要更多的文件。
我仍然想知道哪些文件......
注意:检查nzchar(Sys.which(Sys.getenv("MAKE", "make")))
不足以证明您的环境已准备好从源构建。