使用Travis-CI在packrat(而不是CRAN)中使用R包源文件

Ben*_*Ben 10 r travis-ci packrat

我正在使用一个Rt包,这是一个RStudio项目,我正在使用packrat来保存我依赖于我的项目的包源的本地副本.

每次我提交时,我都会让Travis-CI检查我的R包,但每次Travis构建我的包时,它都会获得最新版本的依赖包,而不是我在packrat/目录中获得的版本.

我可以在richfitz/wood中看到他似乎已经在他的.travis.yml文件中实现了这个目标:

env:
 USE_PACKRAT=1
Run Code Online (Sandbox Code Playgroud)

以及一个相当复杂的make/packrat.mk文件,它使一切正常.

我的问题是,配置我的项目(例如我的.travis.yml文件)的最简单方法是告诉Travis机器从packrat/github上的目录中获取包,而不是从CRAN 获取包?

Ben*_*Ben 6

经过多次试验和错误以及进一步阅读后,似乎这样做会有这样的.travis.yml文件:

# R for travis: see documentation at https://docs.travis-ci.com/user/languages/r

language: R
sudo: false
cache: packages
install:
  - R -e "0" --args --bootstrap-packrat
warnings_are_errors: false
Run Code Online (Sandbox Code Playgroud)

上述文件中的关键行是:

install:
  - R -e "0" --args --bootstrap-packrat
Run Code Online (Sandbox Code Playgroud)

这将启动R,并在本地packrat目录中构建R包,以便它们在Travis机器中可用.

之后,travis将继续并尝试构建程序包,并且不需要联系CRAN来获取依赖项,因为它们已经可用(假设packrat正在按预期工作).

我在这里发现了这个技巧:https://travis-ci.org/ChowHub/paper-pattern-similarity/builds/127262823https://github.com/rstudio/packrat/issues/158.我已经在这里工作了:https://travis-ci.org/benmarwick/mjbtramp/builds/157747326

这样做的好处是我们可以使用与我们在本地使用的完全相同的包来构建travis.当我们构建travis时,我们不必从CRAN获得最新的软件包,现在我们可以更好地控制travis在我们的项目中构建的软件包版本.

缺点是,在特拉维斯构建时间显着增加.在切换到packrat之后,我的一个项目从2-3分钟到13-15分钟.


更新在下面的Noam的问题和Jim的评论之后,似乎我们可以使用cache:这样的方式缓存packrat包:

# R for travis: see documentation at https://docs.travis-ci.com/user/languages/r

language: R
sudo: false
cache:
  directories: $TRAVIS_BUILD_DIR/packrat/
  packages: true
install:
  - R -e "0" --args --bootstrap-packrat
warnings_are_errors: false
Run Code Online (Sandbox Code Playgroud)

在我的用例中,这大大缩短了时间,缩短到1-2分钟.

  • 只是一个小警告:上面的缓存方法,它大大减少了构建时间(是啊!)*当packrat依赖项(因此`packrat.lock`)发生变化时,它不会自动失效*.因此,每当您从packrat添加/更新/删除包时,只要启用了缓存,Travis就不会知道这一点.您已手动删除缓存并再次构建以修复此问题.我提出了[问题](https://github.com/travis-ci/travis-ci/issues/7246) (2认同)