¿Cómo escribo una tarea postal albacora que incluye sólo determinadas carpetas y los propios carpetas?

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

  •  01-10-2019
  •  | 
  •  

Pregunta

Estoy tratando de cerrar la cremallera de los artefactos de un rastrillo de construcción, utilizando el atún blanco es ZipTask . La solución que estoy construyendo tiene tres proyectos que tienen artefactos que necesitan ser comprimido de forma individual, pero sólo el proyecto de ASP.NET MVC se menciona aquí. Aquí está la estructura de directorios de la solución:

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

Al principio me escribió esta tarea:

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

El problema es que la salida de esta tarea es un archivo zip que contiene los contenidos de esas carpetas, no las propias carpetas, lo cual es obviamente indeseable.

A continuación, intentó dar la vuelta al campo flatten_zip a falso (que no es un campo documentado pero se puede encontrar en la fuente ). Esto produjo una postal que contenía las carpetas anteriores, pero en el fondo de toda la jerarquía de carpetas ./src/website/. Quiero que las carpetas anteriores en la raíz de la cremallera, por lo que de no trabajar bien.

Así que mi siguiente tiro era esto, utilizando exclusions, que tampoco está documentado:

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

Esto funcionó para mí, pero cuando recientemente he añadido /AutoMapper/ y /StructureMap/ a la matriz exclusions, que también causó AutoMapper.dll y StructureMap.dll a (por supuesto) también ser excluido de la carpeta bin.

¿Cómo debo editar cualquiera de las tareas mencionadas anteriormente tienen sólo a las carpetas y los archivos que quiero en la raíz de mi postal?

¿Fue útil?

Solución

Puede copiar todos los archivos y carpetas que necesita en un directorio temporal y luego comprimir eso. En otras palabras, establecer el directories_to_zip propiedad a una carpeta que tiene todos los archivos correctos ya copiados en - donde el copiar el código es lo que hace todo el filtrado para usted. Creo que es el uso esperado sin especificar (y la forma en que lo uso). Voy a contrastar las dos ideas para que quede claro.

Estrategia A: Copiar la estructura de carpetas

Copia lo que necesita en un directorio temporal. De esta manera, se establece la propiedad 'directories_to_zip' a una carpeta por ejemplo:

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

Estrategia B: El uso de un filtro

(Esta es su estrategia actual)

Utilice la propiedad directories_to_zip como un filtro en un directorio original (que es una matriz que tiene varios directorios, por lo que no se podía culpar por asumir que debería funcionar de esta manera). A continuación, utiliza diversas propiedades para filtrar los archivos / carpetas que necesita.

Posible resolución

Para resolver el problema, a continuación, usted podría adoptar la estrategia R. En realidad, a menos que haya algún problema extraordinarias con esto (PC lenta, sorprendentemente poco espacio en disco), yo habría pensado que esto sería una manera un poco más robusto de ir al respecto, ya que puede estar seguro de que lo que está pasar con velocidad es exactamente lo que está copiando, que puede ser verificado comprobando el directorio ziptemp.

Por cierto, puedo estar seguro de Estrategia Un funciona porque lo uso (con el atún blanco) a los archivos zip para nuestros instaladores.

Otros consejos

Yo tenía el mismo problema usando 'albacora', quería comprimir una carpeta llamada 'herramientas' (no sólo los contenidos), almacenarlo en una carpeta llamada 'hacia fuera' y el nombre de la 'tools.zip postal ... así que en vez utilicé esta;

require 'zip/zipfilesystem'

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

Sé que es tarde, pero espero que esto ayude a alguien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top