使用Nokogiri xpath解析时未插入Ruby环境变量



我有一个私有的gitlab repo,我想克隆它。我在Environment变量中有密码。带有用户名和密码变量的gitlab repo URL来自XML文件。

sample.xml

<git>
<name>repo</name>
<link>https://user:#{ENV['password']}@gitlab.com/myrepo.git</link>
</git>

Ruby代码:

@sample = Nokogiri::XML(File.open("sample.xml")
repo_link = @sample.xpath("/git/link/text()")
Git.clone(repo_link, 'repodir').checkout('master')

当我尝试上面的代码时,#{ENV['password']没有得到解决并按原样传递给GIT模块。

电流:https://user:#{ENV[密码]}@gitlab.com/myrepo.git

期望值:https://user:<actual_password>gitlab.com/myrepo.git

请帮忙解决这个问题。。

我可以修改XML文件、Ruby代码或GITLAB URL格式。但是流是固定的,URL将在XML中,我必须解析它并使用Ruby克隆repo。

提前感谢!!

#{}在XML中没有任何意义;XML解析器不会(也不应该(插入它…

您可以使用ERB模板,如下所示:

sample.xml

<% require 'cgi' %>
<git>
<name>repo</name>
<link>https://user:<%= CGI.escapeHTML ENV['password'] %>@gitlab.com/myrepo.git</link>
</git>

重要:我使用CGI#escapeHTML来确保您的密码不会破坏XML

Ruby代码:

require 'erb'
xml = ERB.new(File.read('sample.xml'), nil, "<>").result
@sample = Nokogiri::XML(xml)
...

另一种解决方案是在XML中放置占位符,如下所示:

sample.xml

<% require 'cgi' %>
<git>
<name>repo</name>
<link>https://user:%{password}@gitlab.com/myrepo.git</link>
</git>

并将其替换为Ruby代码中的值:

require 'cgi'
xml = File.read.sub(/%{password}/, CGI.escapeHTML ENV['password'])
@sample = Nokogiri::XML(xml)
...

最新更新