2015-06-24 30 views
1

我想在我的rake文件中打包一個zip文件,而且我對rake和ruby很缺乏經驗,所以我很難確定這是失敗的原因。使用Rake :: PackageTask創建一個zip文件

這是我曾嘗試:

def create_zip_file(targetDirectory, projectToZip) 
    puts "target:" + targetDirectory 
    puts "Zipping " + projectToZip 
    semver_contents = get_contents_of('SEMVER') 
    zipFileName = 'ProjectName.' + semver_contents 
    puts zipFileName 
    files_to_include = "../"+ projectToZip + "/bin/" + BUILD_CONFIG + "/**" 
    puts "Including the following files: " + files_to_include 
    Rake::PackageTask.new(zipFileName, semver_contents) do |p| 
     p.need_zip = true 
     p.package_files.include(files_to_include) 
    end 
end 

我的任務調用看起來是這樣的:

exec(:package_zip) {create_zip_file DEPLOY_DIRECTORY, 'ProjectName'} 

我打電話來它像這樣:

bundle exec rake package_zip 

現在,我正在運行這個命令窗口列出了腳本中所有put語句的內容,所以我假設失敗者e在PackageTask任務內部發生。

在控制檯中的錯誤輸出看起來是這樣的:

Exec failed, see the build log for more details. 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/albacore-1.0.0/lib/albacore/support/failure.rb:12:in `fail_with_message' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/albacore-1.0.0/lib/albacore/exec.rb:18:in `execute' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/albacore-1.0.0/lib/albacore/support/createtask.rb:24:in `block in exec' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:240:in `call' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:240:in `block in execute' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:235:in `each' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:235:in `execute' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:179:in `block in invoke_with_call_chain' 
C:/tools/ruby200/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:172:in `invoke_with_call_chain' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:201:in `block in invoke_prerequisites' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:199:in `each' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:199:in `invoke_prerequisites' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:178:in `block in invoke_with_call_chain' 
C:/tools/ruby200/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:172:in `invoke_with_call_chain' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/task.rb:165:in `invoke' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:150:in `invoke_task' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:106:in `block (2 levels) in top_level' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:106:in `each' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:106:in `block in top_level' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:115:in `run_with_threads' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:100:in `top_level' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:78:in `block in run' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:176:in `standard_exception_handling' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/lib/rake/application.rb:75:in `run' 
C:/tools/ruby200/lib/ruby/gems/2.0.0/gems/rake-10.4.2/bin/rake:33:in `<top (required)>' 
C:/tools/ruby200/bin/rake:23:in `load' 
C:/tools/ruby200/bin/rake:23:in `<main>' 
Tasks: TOP => package => package_zip 

的情形產生被我錯過了一些東西很明顯的或做了一些愚蠢的,只是有一個很難抓住它。

回答

1

與各地辦公室的幾個人商量之後,嘗試了許多與Pauls答案有關的不同事情,我終於找到了一個解決方案,那就是根本不使用包任務。相反,我們使用rubyzip。

下面是我們結束了

def create_zip_file(targetDirectory, projectToZip) 
    semver_contents = get_contents_of('SEMVER') 
    zipFileName = "#{targetDirectory}/#{projectToZip}.#{semver_contents}.zip" 
    filesToZip = FileList["../#{projectToZip}/bin/#{BUILD_CONFIG}/**"] 
    Zip::File.open(zipFileName, Zip::File::CREATE) do |zipFile| 
     filesToZip.each do |filename| 
      zipFile.add(filename, filename) 
     end 
    end  
end 
1

exec任務告訴rake在命令行/ shell上運行。不運行任務。

你可能想:

task :package_zip do 
    create_zip_file DEPLOY_DIRECTORY, 'ProjectName' 
end 

您的變量應該是蛇的情況下也都。儘管只是更容易閱讀的Ruby,但這不是什麼大不了的事。

,你真的想看看串插,這將使你的生活輕鬆

因此,例如

puts "target: #{target_directory}" 
puts "Zipping #{project_to_zip}" 
semver_contents = get_contents_of('SEMVER') 
zipFileName = "ProjectName.#{semver_contents}" 

(不運行它所以要小心提供的代碼樣本!)


啊,還看着docs for PackageTask

運行Rake::PackageTask.new的代碼只會創建其他任務 - 實際上並不運行它們!

article顯示使用

# Have to keep a reference to the PackageTask object 
package_task = Rake::PackageTask.new("gliffy-php-client",GLIFFY_VERSION) do |p| 
    p.need_tar = true 
    p.need_zip = true 
    # Executed BEFORE any other tasks; DOC_FILES don't exist yet 
    p.package_files = SRC_FILES + EXAMPLE_FILES 
end 

file package_task.package_dir_path => DOC_DIR 

file DOC_DIR => SRC_FILES + EXAMPLE_FILES do |t| 
    system("phpdoC#{PHP_DOC_ARGS}"); 
    doc_files = FileList.new(DOC_DIR + "/**/**"); 
    # Have to add these files to the package_task file list 
    package_task.package_files = package_task.package_files + doc_files 
end 

的例子但是,如果你看一下the source of the task它最終只是調用與一個文件列表和zip命令外殼。如果你知道ZIP是什麼機器將運行你的任務(或安裝它),你可能會更好只運行類似的道路上:

task :make_zip do 
    semver_contents = get_contents_of('SEMVER') 
    zipFileName = "ProjectName.#{semver_contents}" 
    targetDir = "../#{projectToZip}/bin/#{BUILD_CONFIG}/**" 
`zip -r #{zipFileName} #{targetDir}` 
end 
+0

從EXEC更改爲任務似乎完成,但在輸出無壓縮文件。看起來我有一個新問題。使字符串插值也發生了變化,我更喜歡它們!謝謝! –