Wie schreibe ich einen Weißen Thun zip Aufgabe, die nur bestimmte Ordner und die Ordner selbst enthält?

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

  •  01-10-2019
  •  | 
  •  

Frage

Ich versuche, die Artefakte eines Rake-Build Reißverschluss, mit Weißen Thun ist ZipTask . Die Lösung, die ich baue hat drei Projekte, die Artefakte, die einzeln gezippt werden müssen, sondern nur das ASP.NET MVC-Projekt wird hier erwähnt werden. Hier ist die Verzeichnisstruktur der Lösung:

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

Zuerst schrieb ich diese Aufgabe:

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

Das Problem ist, die Ausgabe dieser Aufgabe ist eine ZIP-Datei mit dem Inhalt des Ordners, nicht die Ordner selbst, die offensichtlich unerwünscht ist.

Als nächstes habe ich versucht, das flatten_zip Feld zu falschen Spiegeln (was nicht ein dokumentiertes Feld, aber Sie es in die Quelle ). Diese eine Zip erzeugt, die die oben genannten Ordner enthalten ist, aber am Ende der gesamten ./src/website/ Ordnerhierarchie. Ich mag die oben genannten Ordner an der Wurzel des Reißverschlusses, so dass die nicht entweder zu arbeiten.

Also mein nächster Schuss war diesen, mit exclusions, die auch dokumentiert ist nicht:

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

Das ist für mich gearbeitet, aber als ich vor kurzem /AutoMapper/ und /StructureMap/ zum exclusions Array hinzugefügt, es auch AutoMapper.dll und StructureMap.dll zu (natürlich) verursachte auch aus dem Ordner ist ausgeschlossen werden.

Wie soll ich eine der oben genannten Aufgaben bearbeiten nur um die Ordner und Dateien, die ich an der Wurzel meines zip will?

War es hilfreich?

Lösung

Sie können kopieren Sie alle Dateien und Ordner, die Sie in ein temporäres Verzeichnis benötigen und zip dann das wieder wett. Mit anderen Worten, setzen Sie die Eigenschaft directories_to_zip in einen Ordner, die in alle die richtigen Dateien bereits kopiert hat - wo die Kopieren Code ist, was alles für Sie die Filterung der Fall ist. Ich denke, das ist die nicht näher bezeichnet erwartete Nutzung (und die Art, wie ich es verwenden). Ich werde nur die beiden Ideen kontrastiert, um deutlich zu machen.

Strategie A: Kopieren Sie die Ordnerstruktur

Kopieren, was Sie in ein temporäres Verzeichnis benötigen. Auf diese Weise stellen Sie die ‚directories_to_zip‘ Eigenschaft auf einen Ordner zB:

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

Strategie B: Verwenden Sie einen Filter

(Dies ist Ihre aktuelle Strategie)

Verwenden Sie die directories_to_zip Eigenschaft als Filter auf einem Original-Verzeichnis (es ist ein Array, das mehrere Verzeichnisse nimmt, so dass Sie nicht für die Annahme, verantwortlich gemacht werden könnten, sollte es auf diese Weise funktionieren). Sie verwenden dann verschiedene Eigenschaften, um die Dateien / Ordner auswählen, die Sie benötigen.

Mögliche Lösung

Ihr Problem zu lösen, dann könnten Sie Strategie A. Eigentlich nehmen sie an, es sei denn, es gibt keine außergewöhnlichen Probleme mit diesem (langsamen PC, erstaunlich wenig Speicherplatz), würde ich gedacht, das eine etwas robustere Art und Weise sein würde, zu gehen darüber, weil Sie können sicher sein, dass genau das, was Sie zippen ist das, was Sie kopieren, die durch die Überprüfung der ziptemp Verzeichnis überprüft werden kann.

Im übrigen kann ich sicher sein, Strategie A funktioniert, weil ich es verwenden (mit Weißer Thun) zu Zip-Dateien für unsere Installateure.

Andere Tipps

ich das gleiche Problem mit ‚Weißer Thun‘ hatte, wollte ich einen Ordner zip namens ‚Tools‘ (nicht nur der Inhalt), sollte sie in einem Ordner ‚out‘ genannt und nennen Sie das zip ‚tools.zip ... so stattdessen benutzte ich diese;

require 'zip/zipfilesystem'

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

ich weiß, seine spät, aber ich hoffe, dass dies jemand hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top