My gem使用Tidy HTML Validator的本地副本。它在lib/tidy/tidy
中可用。我的测试在本地运行得很好,但在Travis CI上,我得到了一个错误,即找不到Tidy。
Errno::ENOENT:
No such file or directory - tidy
代码如下:
stdin, stdout, stderr = Open3.popen3('tidy -quiet')
是否存在阻止执行本地可执行文件的限制?我还调用Jigsaw CSS Validator的本地副本,它是一个Javajar
文件,执行方式如下:
`java -jar css-validator.jar --output=soap12 file:#{uri}`
这在Travis CI上非常有效。Open3
可能有问题吗?
以下是GitHub回购的链接:https://github.com/jmuheim/headhunter以下是Travis CI构建失败的链接:https://travis-ci.org/jmuheim/headhunter
更新
我已经将执行外部java
可执行文件的代码重写为也使用Open3
,并且它正在工作。所以问题出在tidy
上。
为了进一步调试,我将tidy
重命名为tidy2
(以确保真正调用了所需的可执行文件),并且在调用它之前添加了一个手动File.exist? 'tidy'
,因此如果找不到它,这将引发错误。
Dir.chdir(VALIDATOR_DIR) do
raise "Could not find tidy in #{Dir.pwd}" unless File.exists? EXECUTABLE
# Docs for Tidy: http://tidy.sourceforge.net/docs/quickref.html
stdin, stdout, stderr = Open3.popen3("#{EXECUTABLE} -quiet")
# ...
end
文件确实找到了,但执行它仍然会导致此错误。
1) Headhunter::HtmlValidator#validate returns a local response when calling the validator succeeds
Failure/Error: subject.validate('invalid.html', read_file('html_validator/invalid.html'))
Errno::ENOENT:
No such file or directory - tidy2
# ./lib/headhunter/html_validator.rb:20:in `block in validate'
# ./lib/headhunter/html_validator.rb:16:in `chdir'
# ./lib/headhunter/html_validator.rb:16:in `validate'
# ./spec/lib/headhunter/html_validator_spec.rb:9:in `block (4 levels) in <top (required)>'
# ./spec/lib/headhunter/html_validator_spec.rb:8:in `block (3 levels) in <top (required)>'
所以我现在唯一能猜测的是是否存在权限问题?是否有一种方法可以使用Travis CI为本地可执行文件设置权限?
我也试着像有人在评论中建议的那样,将tidy
放入bin
,但这似乎也没有改变什么。
看起来您的tidy2
可执行文件是适用于OS X的Mach-O二进制文件,但Travis工作程序运行Linux。尝试从中包含合适的ELF二进制文件http://tidy.sourceforge.net/#binaries.
两件事:
生成程序时,环境通常与当前环境不同,因此您必须检查环境是什么。cron
、monit
和一些ruby方法调用就是这样。
在您的情况下,对于Open,它使用Process.spawn
,因此不能保证您在自己的目录中。Open.popen3
采用:chdir
选项,所以将其设置为您的Dir.pwd
,看看会发生什么。
您也可以尝试只使用绝对路径。
来源
http://ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3
https://stackoverflow.com/a/5917927/463225
http://ruby-doc.org/core-1.9.3/Process.html#method-c-典当