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

时间:2015-01-26 14:14:47

标签: postgresql netbeans ant psql

我在Windows 7上运行PostgreSQL 9.2。我正在尝试使用应用标记运行Ant目标,并将可执行属性设置为来自NetBeans 8.0.2构建文件的psql。我在正确的位置创建了一个pgpass.conf文件,其中包含postgres用户的正确密码,我可以在命令提示符下运行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>

1 个答案:

答案 0 :(得分:2)

a_horse_with_no_name让我考虑了exec标记但尝试直接通过psql标记或exec标记运行apply仍然会引发有关未提供密码的错误。然后我意识到psql从cmd提示符顺利运行。我开始玩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命令行,并且所有内容都可以处理。
  7. 瞧!多么大惊小怪!我对MySql没有类似的困难,因为你可以直接将密码传递给命令行。