从Ant调用Ruby时,如何解决`$('作为全局变量名称的问题?

时间:2019-05-16 12:39:40

标签: ruby ant homebrew

我需要在远程Mac盒上安装Homebrew,由于某些设计决策,我可以在该计算机上运行任何东西的唯一方法是执行Ant脚本。

我正在尝试改编instructions from the Homebrew website并运行与之等效的方法:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

...来自Ant构建文件。在这里:

<project name="default" default="homebrew">
    <target name="ruby" >
        <echo message="Checking Ruby..." />
        <exec executable="/usr/bin/ruby">
            <arg value="--version"/>
        </exec>
        <echo message="Checking Ruby done!" />
    </target>
    <target name="homebrew" depends="ruby">
        <echo message="Installing Homebrew..." />
        <exec executable="/usr/bin/ruby">
            <arg line=' -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"'/>
        </exec>
        <echo message="Homebrew installation done!" />
    </target>
</project>

这就是我要得到的:

ruby:
     [echo] Checking Ruby...
     [exec] ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin16]
     [echo] Checking Ruby done!

homebrew:
     [echo] Installing Homebrew...
     [exec] -e:1: `$(' is not allowed as a global variable name
     [exec] Result: 1
     [echo] Homebrew installation done!

如何解决这个$(' is not allowed as a global variable name问题?是否有可能以某种方式摆脱$符号? 简而言之,如何修改该Ant构建文件以安装Homebrew?我可以将Homebrew安装命令放在bash脚本中,但我只想修复语法即可直接从Ant进行操作。

1 个答案:

答案 0 :(得分:1)

Ant的exec任务通常会使复杂的命令行操作感到窒息。通常,最好坚持多个exec步骤,而不是完整的arg value包含多个单独的arg line

尝试以下方法:

<target name="ruby">
    <echo message="Checking Ruby..." />

    <exec executable="/usr/bin/ruby">
        <arg value="--version"/>
    </exec>

    <echo message="Checking Ruby done!" />
</target>

<target name="homebrew" depends="ruby">
    <echo message="Installing Homebrew..." />

    <exec executable="curl" outputproperty="homebrew.install">
        <arg value="-fsSL" />
        <arg value="https://raw.githubusercontent.com/Homebrew/install/master/install" />
    </exec>

    <exec executable="/usr/bin/ruby" failonerror="true">
        <arg value="-e"/>
        <arg value="${homebrew.install}"/>
    </exec>

    <echo message="Homebrew installation done!" />
</target>

在这里,首先将远程安装脚本卷曲并使用exec的{​​{1}}属性作为Ant属性存储,然后作为参数传递给ruby。

(请注意,我还向安装步骤中添加了outputproperty,但这只是我的用例假设。可以根据需要将其删除。)