问题描述
在开发R包时,使用Travis进行持续集成。测试和R CMD CHECK
在本地以及Linux下的3个R版本(oldrel、release和devel)通过。但在macOS下的所有三个版本均失败,并且Travis日志中没有任何信息:
...R CMD check fail logs
0.01s$ for name in $(find "${RCHECK_DIR}" -type f -name "*fail"); do
echo ">>> Filename: ${name} <<<";
cat ${name};
done
logR CMD check log logs...
用户在Travis日志中查看了所有在testthat
中编写的测试都失败了。尽管Travis的测试曾经在Linux和macOS上都通过,但用户不希望在等待Travis的回答时再去修改代码以寻找问题,而是希望能够有一些更直接、更快速的方法来解决问题。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
检查警告与错误
首先,确保你在.travis.yml
中使用了推荐的R包设置,将警告升级为错误,如下所示:
warnings_are_errors: true
接着,查看Travis日志中的前一部分,即Checking package
的部分,这部分会给出更多有关问题的信息。
解决字体缺失问题
对于macOS下的问题,特别是涉及到字体缺失的情况,可以在Checking package
部分查找问题的线索。例如,下面是一个字体缺失问题的示例:
在Travis日志中,Checking package
部分显示inconsolata
字体丢失,导致文档构建失败:
* checking PDF version of manual ... WARNING
LaTeX errors when creating PDF version.
This typically indicates Rd problems.
LaTeX errors found:
! LaTeX Error: File `inconsolata.sty' not found.
...
这会导致LaTeX出现错误、R出现警告以及Travis报错。
解决方案示例
对于字体缺失问题,有时可能是TeXLive版本不匹配导致的。你可以尝试以下解决方案:
- 在
.travis.yml
中指定较旧的macOS版本,例如 macOS 10.12:
osx_image: xcode9.2
这可以通过以下链接查找不同XCode和OSX版本的对应关系:Travis页面。
方案2
使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。你可以使用docker run
命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。
示例
以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:
#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b
在这个示例中,我们首先使用docker run
命令启动容器A,并将其命名为container_a
。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo
命令来测试)。一旦容器A就绪,我们再使用docker run
命令启动容器B,并将其命名为container_b
。
请注意,这只是一个示例脚本,实际情况可能因环境和需求而异。你可以根据实际情况进行调整和扩展。
总结
当Travis中的R包测试在macOS下失败并且Travis日志中缺乏详细信息时,可以尝试以下解决方案:
- 检查
.travis.yml
中的设置,确保警告被升级为错误。 - 在Travis日志中查找
Checking package
部分,以获取更多有关问题的信息。 - 解决字体缺失等可能导致构建失败的问题,可以尝试降级TeXLive版本等方法。
- 如果需要更精细的控制,可以编写脚本或使用工具来管理容器的启动顺序,确保容器A在容器B之前启动。
以上是解决Travis中R包测试失败的一些建议,希望能对你有所帮助!