Serverspec不正确地检查包版本

我有一个serverspec问题。 我试图检查在Ubuntu上安装的软件包版本。

我使用这个代码:

describe 'java packages' do it 'package openjdk-9-jre should be installed with the correct version' do expect(package('openjdk-9-jre')).to be_installed.with_version('9~b114-0ubuntu1') end end 

Serverspec运行dpkg-query命令来检查软件包,但转义tilda字符,它不起作用。 serverspec运行:

 dpkg-query -f '${Status} ${Version}' -W openjdk-9-jre | grep -E '^(install|hold) ok installed 9\\~b114-0ubuntu1$' 

代替

 dpkg-query -f '${Status} ${Version}' -W openjdk-9-jre | grep -E '^(install|hold) ok installed 9~b114-0ubuntu1$' 

我该如何解决这个问题?

问题在这里: https : //github.com/mizzy/specinfra/blob/92ccc19714ead956589127c40e3cd65faf38cb8b/lib/specinfra/command/debian/base/package.rb#L6 。

Specinfra正在使用#{Regexp.escape(escape(version))}而不是#{Regexp.escape(version))来转义with_version链中的字符。 由于Specinfra / serverspec的贡献政策,这将需要PR到Specinfra进行修复。 我可以把它放在我要做的事情列表上,并在完成后通知您,因为我保留了最新的Specinfra分支,并且是两者的贡献者,所以我知道代码库。

同时,你将不得不做一个command匹配器的解决方法。

 describe 'java packages' do it 'package openjdk-9-jre should be installed with the correct version' do describe command("dpkg-query -f '${Status} ${Version}' -W openjdk-9-jre") do its(:stdout) { is_expected.to match('^(install|hold) ok installed 9\~b114\-0ubuntu1$') } end end end 

Specinfra PR: https : //github.com/mizzy/specinfra/pull/608