无法从 NetBeans 8.0.2 中的 ant 目标 运行ning 运行 psql

Can't run psql from an ant target running in NetBeans 8.0.2

我 运行 在 Windows 7 上使用 PostgreSQL 9.2。我正在尝试 运行 Ant 目标使用带有可执行文件 属性 集的应用标签从 NetBeans 8.0.2 构建文件到 psql。我已经在正确的位置使用 postgres 用户的正确密码创建了一个 pgpass.conf 文件,我可以在命令提示符下 运行 psql 而无需输入密码。但是当我 运行 Ant 目标时,我在输出文件中收到一条错误消息,指出目标失败,因为没有提供密码。我究竟做错了什么?目标看起来像这样:

<filelist id="create-dbfiles" dir="${root}" files="createdb.sql"/> 
    <target name="create-db">
        <apply executable="psql"  addsourcefile="false" output="output.txt">
            <arg value="-U postgres" />
            <arg value="-w" />
            <filelist refid="create-dbfiles"/>
            <redirector>
                <inputmapper type="glob" from="*" to="${root}\*" />           
            </redirector>
        </apply>
    </target>

a_horse_with_no_name 让我想到了 exec 标签,但尝试通过 exec 标签或 apply 标签直接 运行 psql 仍然抛出有关未提供密码的错误。然后我从cmd提示中顺利的意识到psql 运行。我开始尝试调用 cmd.exe 并将命令传递给命令行,并找到了解决方案:

<filelist id="clean-dbfiles" dir="${root}" files="cleandb.sql"/> 
<target name="clean-db">
    <apply executable="cmd.exe"  addsourcefile="true" >
        <filelist refid="clean-dbfiles"/>
        <env key="PGPASSWORD" value="rootpassword"></env>
        <arg value="/c"></arg>
        <arg value="psql -w -U postgres -f " />
        <srcfile />
    </apply>
</target>
<filelist id="create-dbfiles" dir="${root}"  files="createdb.sql"/> 
<target name="create-db">
    <apply executable="cmd.exe"  addsourcefile="true" >
        <filelist refid="create-dbfiles"/>                    
        <env key="PGPASSWORD" value="rootpassword"></env>
        <arg value="/c"></arg>
        <arg value="psql -w -U postgres -f "/>
        <srcfile />
    </apply>
</target>

以下是为 postgres 数据库创建构建脚本的两个关键目标。注意以下几点:

  1. 运行 cmd.exe 不是 psql 直接
  2. addsourcefile 设置为 true 因为我想为每个目标调用整洁的小型独立 SQL 文件。
  3. applyfilelist 一起使用,因为对于我的 createtablespopulate 目标,我可能有一个单独的 SQL 文件目录
  4. 放弃调用 pgpass.conf 文件的希望。由于某种原因,NetBeans 中的 Ant 无法访问它。求助于 PGPASSWORD 环境密钥并将其设置为所需的密码。这是 运行出于开发目的在本地进行的,因此安全性不是问题。
  5. 您需要将 /c 开关传递给 cmd.exe 以便您可以传递命令行。我没有将 psql 命令行分成单独的参数,因为我认为完整的行作为单个参数传递给 cmd.exe。
  6. addsourcefile 设置为 true,因此文件列表中的每个文件都会在 -f 开关之后附加到 psql 命令行,一切正常。

瞧!真是大惊小怪! MySql 我没有类似的困难,因为你可以直接将密码传递给命令行。