2017-08-08 1 views
1

J'essaie de prendre un fichier zip non-produit par Bazel, de modifier certains fichiers, en conservant la plupart d'entre eux, et finalement produire une nouvelle archive avec le ~ contenu original (plus mes modifications)Comment modifier un seul fichier lors du reconditionnement d'une archive?

J'ai de la difficulté à préciser mes règles d'une manière propre et ce serait génial s'il y avait une suggestion sur la façon de le faire. J'importe le fichier zip d'origine via la règle WORKSPACE 'new_http_archive'. Cela fonctionne plutôt bien. Je mets le fichier de construction dans un paquet d'un niveau sous la racine. Appelons cela 'foo_repackage'.

Dans foo_repackage/BUILD.root_archive:

package(default_visibility = ["//visibility:public"]) 

filegroup(
    name = "all_files", 
    srcs = glob(
     ["**"], 
     exclude = ["*", "share/doc/api/**"] 
    ), 
) 

Le plus gros problème est dans le fichier foo_repackage/BUILD, je voudrais prendre tous les fichiers hors du groupe all_files ci-dessus, sauf pour quelques-uns d'entre eux que je vais modifier. Je ne peux pas voir comment le faire facilement. Il semble que chaque fichier que je veux modifier doit être exclu du glob ci-dessus et créer une nouvelle règle qui spécifie ce fichier. Cela signifie que je dois continuer à modifier la règle d'exclusion globale all_files.

Si je pouvais créer un nouveau groupe de fichiers qui était tous les fichiers ci-dessus avec des fichiers exclus, ce serait idéal.

Je dois mentionner que la dernière étape est bien sûr d'utiliser pkg_tar pour reconditionner le résultat - c'est foo_repackage/CONSTRUIRE

pkg_tar(
    name = "OutputTarball", 
    files = ["@root_archive//:all_files"], 
    deps = [":layers_of_modified_files"], 
    strip_prefix = "/../root_archive", 
) 

Quelqu'un at-il une meilleure façon de le faire?

Merci, Sean

+0

Cela me semble raisonnable. Quelle est votre principale préoccupation ici? Que la liste d'exclusion deviendra très longue? Vous pourriez rencontrer un problème où vous essayez de générer des fichiers avec le même nom que ceux qui existent sur le système de fichiers (à partir de la fermeture éclair). Bazel n'aime pas ça. – zlalanne

Répondre

1

Pouvez-vous utiliser une variable comme:

MODIFIABLE_FILES = [ 
    "some/file", 
    "another/file", 
    ... 
] 

filegroup(
    name = "static-files", 
    srcs = glob(["**"], exclude = MODIFIABLE_FILES) 
) 

filegroup(
    name = "modifiable-files", 
    srcs = MODIFIABLE_FILES, 
) 

Ensuite, la liste des fichiers statiques et les fichiers modifiables seront conservés dans la synchronisation et vous obtiendrez une erreur de compilation si vous avez accidentellement spécifiez un fichier modifiable inexistant.

+0

C'est parfait. Je n'ai pas pensé à la solution variable - cela rend la maintenance facile, et en particulier, il est peu probable que l'on fasse une erreur en modifiant l'un des fichiers statiques, car ils ne seront pas dans le second groupe de fichiers. –