我在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>
答案 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数据库创建构建脚本的两个关键目标。请注意以下几点:
cmd.exe
而不是psql
addsourcefile
设置为true
因为我想为每个目标调用整齐的小型自包含SQL文件。apply
与filelist
一起使用,因为对于我的createtables
或populate
目标,我可能有一个单独的SQL文件目录瞧!多么大惊小怪!我对MySql没有类似的困难,因为你可以直接将密码传递给命令行。