Come faccio a scrivere un compito zip Tonno bianco che include solo alcune cartelle e le cartelle stesse?

StackOverflow https://stackoverflow.com/questions/3151887

  •  01-10-2019
  •  | 
  •  

Domanda

Sto cercando di comprimere i manufatti di una build di rastrello, utilizzando tonno bianco è ZipTask . La soluzione Sto costruendo ha tre progetti che hanno artefatti che devono essere zippato singolarmente, ma solo il progetto ASP.NET MVC sarà menzionato qui. Ecco la struttura di directory della soluzione:

rakefile.rb
solution.sln
src/
    (other projects that are not relevant)
    website/
        (various folders I don't want included in the artifacts)
        bin/
        Content/
        Scripts/
        Views/
        Default.aspx
        Global.asax
        web.config

In un primo momento ho scritto questo compito:

website_directory = File.join '.', 'src', 'website'
website_project_name = 'website'

zip :zip => [ :run_unit_tests, :less ] do |zip|
  zip.directories_to_zip = [ 'bin', 'Content', 'Scripts', 'Views' ].map{ |folder| File.join website_directory, folder }
  zip.additional_files = [ 'Default.aspx', 'favicon.ico', 'Global.asax', 'web.config'].map{ |file| File.join website_directory, file }
  zip.output_file = get_output_file_name
  zip.output_path = get_artifacts_output_path website_project_name
end

Il problema è che l'uscita di questo compito è un file zip contenente i contenuto di queste cartelle, non le cartelle stesse, che è ovviamente auspicabile.

Dopo, ho provato lanciando il campo flatten_zip su false (che non è un campo documentato, ma lo si può trovare in la fonte ). Questo ha prodotto una zip che conteneva le cartelle di cui sopra, ma in fondo alla gerarchia intera cartella ./src/website/. Voglio che le cartelle di cui sopra alla radice della cerniera, in modo che di non funziona neanche.

Quindi il mio prossimo colpo è stato questo, utilizzando exclusions, che non è anche documentato:

zip :zip => [ :run_unit_tests, :less ] do |zip|
  zip.directories_to_zip website_directory
  zip.exclusions = [ /.git/, /.+\.cs/, /App_Data/, /Attributes/, /AutoMapper/, /Controllers/, /Diagrams/, /Extensions/, /Filters/, /Helpers/, /Models/, /obj/, /Properties/, /StructureMap/, /Templates/, /CompTracker.Web.csproj/, /Default.aspx.cs/, /Global.asax.cs/, /Publish.xml/, /pdb/ ]
  zip.output_file = get_output_file_name
  zip.output_path = get_artifacts_output_path website_project_name
end

Questo ha funzionato per me, ma quando di recente ho aggiunto /AutoMapper/ e /StructureMap/ alla matrice exclusions, ha anche causato AutoMapper.dll e StructureMap.dll a (ovviamente) anche essere esclusi dalla cartella bin.

Come devo modificare uno qualsiasi dei compiti di cui sopra per avere solo le cartelle ei file che voglio alla radice del mio zip?

È stato utile?

Soluzione

È possibile copiare tutti i file e le cartelle necessari in una directory temp e poi zip che fino. In altre parole, impostare la directories_to_zip proprietà per una cartella che ha tutti i file corretti già copiati nel - dove il la copia di codice è ciò che fa tutto il filtraggio per voi. Penso che sia l'uso non specificato atteso (e il modo in cui lo uso). Mi limiterò a contrapporre i due idee per mettere in chiaro.

Strategia A: Copia la struttura delle cartelle

Copia quello che vi serve in una directory temporanea. In questo modo, è possibile impostare il 'directories_to_zip' immobile in una cartella ad esempio:

directories_to_zip = 'ziptemp/all.my.stuff.copied.here/'

Strategia B: Usare un filtro

(Questa è la vostra strategia corrente)

Utilizzare la proprietà directories_to_zip come filtro su una directory originale (si tratta di un array che prende più directory, quindi non si poteva essere incolpato per l'assunzione dovrebbe funzionare in questo modo). È quindi utilizzare varie proprietà per filtrare i file / cartelle necessari.

possibile soluzione

Per risolvere il problema, allora, si potrebbe adottare la strategia A. In realtà, a meno che non ci sia eventuali problemi straordinari con questo (PC lento, incredibilmente spazio su disco), avrei pensato che questo sarebbe un modo un po 'più robusto di andare su di esso perché si può essere sicuri che ciò che si sta zippare è esattamente ciò che si sta copiando, che può essere verificata controllando la directory ziptemp.

Per inciso, posso essere sicuro di strategia Un funziona perché lo uso (con Tonno bianco) per zip file per i nostri installatori.

Altri suggerimenti

Ho avuto lo stesso problema utilizzando 'tonno bianco', ho voluto comprimere una cartella chiamata 'strumenti' (non solo il contenuto), conservarlo in una cartella chiamata 'fuori' e il nome del 'tools.zip zip ... così invece ho usato questo;

require 'zip/zipfilesystem'

Zip::ZipFile::open("out/tools.zip", Zip::ZipFile::CREATE) { |z|
    Dir['{tools}/**/*'].each { |f|
        z.add(f, f)
    }
}

So che la sua tardi, ma spero che questo aiuta qualcuno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top