1

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

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

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

不幸的是,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 属性,但无济于事。

对我接下来可以尝试的事情有什么想法吗?

蚂蚁 1.8.4,Windows 7

4

2 回答 2

4

似乎 S3Sync 正在尝试清除进度线,但由于无法访问控制台而失败。有道理,因为在 Ant 下运行时实际上并没有控制台——至少没有可以执行所有I/O 命令的控制台。

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

于 2012-12-03T01:32:53.147 回答
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}" />
于 2012-12-05T20:31:58.793 回答