2017-06-28 1 views
2

Notre repo monolithe ressemble à quelque chose comme ceci:Comment puis-je dériver le fichier BUILD à partir d'une cible produite?

├── bin 
    └── ... 
└── source 
    ├── foo 
     ├── BUILD 
     └── ... 
    └── bar 
     ├── BUILD 
     └── ... 
    └── ... 

Nous avons des milliers de fichiers BUILD produisant des milliers de cibles dans le répertoire bin.

Maintenant que nous avons tous ces binaires compilés dans le répertoire bin, il serait bien d'avoir une méthode pour dériver le fichier BUILD qui s'y trouve.

Je ne veux pas écrire à la main un outil qui analyse récursivement toutes les règles de construction du fichier BUILD et imprime la réponse. Est-ce quelque chose qui peut être réalisé avec la requête bazel?

La plupart de nos règles de construction sont assez typiques:

cc_binary(
    name="foo", 
    ... 
) 
py_binary(
    name="bar.py", 
    ... 
) 

L'objectif final serait de lancer quelque chose comme:

where-source ./bin/foo 
./source/foo/BUILD created ./bin/foo 

Répondre

1

Si vous coupez l'bin/ (je suppose que vous utilisez ? --symlink_prefix), vous pouvez utiliser bazel query:

# Where did bin/foo/bar/baz get defined? 
$ bazel query foo/bar/baz 
//foo/bar:baz 

O r, pour obtenir des informations détaillées sur l'emplacement:

$ bazel query --output=location foo/bar/baz 
/home/kchodorow/gitroot/proj/source/foo/bar/BUILD:3:1: go_binary rule //foo/bar:baz 

Ou, pour obtenir la définition de la cible elle-même:

$ bazel query --output=build foo/bar/baz 
go_binary(
    name = "baz", 
    srcs = ["//foo/bar/baz.go"], 
) 

Voir What build rule contains file src/main/java/com/example/cache/LRUCache.java as a source? et le reste de cette page pour plus d'exemples de bazel query.