我想创建一些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
答案 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}" />