Ant exec与S3Sync的命令行行为不同

时间:2012-12-03 00:56:36

标签: ant amazon-s3

我想创建一些ant目标来上传和下载各种文件到Amazon S3。我一直在命令行中成功使用S3Sync,所以我想我只是将它包装在一个Ant exec中

<exec executable="tools/s3sync/S3Sync.exe" failonerror="true" />

所有配置都在S3Sync使用的配置文件中。我想在某个时候添加一些args并在macrodef中包装,但是我对这个例子保持简单。

不幸的是,exe似乎不喜欢从Ant运行。

 [exec]
 [exec] Unhandled Exception: System.IO.IOException: The handle is invalid.
 [exec]
 [exec]    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
 [exec]    at System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded)
 [exec]    at System.Console.get_WindowWidth()
 [exec]    at S3Sync.Program.ClearProgressLines()
 [exec]    at S3Sync.Program.WriteConsoleLineClear(String InputLine)
 [exec]    at S3Sync.Program.WriteToLog(String LogLine, Int32 LogLineLevel)
 [exec]    at S3Sync.Program.Main(String[] args)

我尝试过设置dir,spawn,vmlauncher和其他exec属性,但无济于事。

关于我接下来可以尝试的事情的任何想法?

Ant 1.8.4,Windows 7

2 个答案:

答案 0 :(得分:4)

似乎S3Sync正在尝试清除进度线,并因为无法访问控制台而失败。有道理,因为在Ant下运行时没有真正的控制台 - 至少不是一个可以执行所有 I / O命令的控制台。

您是否尝试添加-ShowTransferProgress false参数?

答案 1 :(得分:0)

以下是我认为有用的其他人的宏定义。我的密钥和其他设置在我的s3Sync.exe.config

中设置
<macrodef name="s3upload">
    <attribute name="bucket"/>
    <attribute name="logOnly" default="${s3upload.log.only}"/>
    <attribute name="localFolder"/>
    <sequential>
        <exec executable="${s3sync.exe}" failonerror="true">
            <arg line="-SyncDirection upload"/>
            <arg line="-LogOnlyMode @{logOnly}"/>
            <arg line="-BucketName @{bucket}"/>
            <arg line="-LocalFolderPath @{localFolder}"/>
            <arg line="-ShowTransferProgress false"/>
            <arg line="-UploadHeaders x-amz-acl:public-read"/>
        </exec>
    </sequential>
</macrodef>

<macrodef name="s3download">
    <attribute name="bucket"/>
    <attribute name="logOnly" default="false"/>
    <attribute name="localFolder"/>
    <sequential>
        <exec executable="${s3sync.exe}" failonerror="true">
            <arg line="-SyncDirection download"/>
            <arg line="-LogOnlyMode @{logOnly}"/>
            <arg line="-BucketName @{bucket}"/>
            <arg line="-LocalFolderPath @{localFolder}"/>
            <arg line="-ShowTransferProgress false"/>
        </exec>
    </sequential>
</macrodef>

他们像这样使用

<s3download bucket="${s3.logs.bucket}" localFolder="${local.logs.path}" />