2017-08-01 3 views
0

Ich habe ein Bazel Projekt, das ein python/ Ordner in der Wurzel enthält. Dieser Ordner enthält zwei Dateien:Zipping Bazel generierten Dateien für die Bereitstellung

# BUILD 
py_binary(
    name = "foo", 
    srcs = ["foo.py"], 
    deps = ["//cc:bar"], 
) 

und

# foo.py 
import cc.bar as bar 

# This is a SWIG-wrapped C++ function that prints "hello world" 
print(bar.hello_world()) 

Der cc/ Ordner, die auch in der Wurzel ist, enthält (unter anderem) die folgende Regel:

# Expose the shared object library to Python. 
py_library(
    name = "bar", 
    srcs = [":bar_swig.py"], # Generated by SWIG. 
    data = [":_bar.so"], # Generated by SWIG. 
    visibility = ["//python:__pkg__"], 
) 

Lauf bazel build //python:foo generiert bazel-bin/python/foo.runfiles/ und bazel-bin/python/foo. Ich möchte eine Regel in Bazel schreiben, die dieses Verzeichnis und die Binärdatei sammelt und sie in foo.zip reißt.

Dies ist, was ich kam mit:

genrule(
    name = "zip_foo", 
    srcs = ["//python:foo"], 
    outs = ["foo.zip"], 
    cmd = "zip [email protected] $(locations //python:foo)", 
) 

die erzeugte Zip foo.runfiles/ nicht jedoch enthalten. Wie schreibe ich eine Regel, die alle Laufzeitabhängigkeiten eines Ziels komprimiert? Ich möchte, dass diese Regel so allgemein wie möglich ist, was bedeutet, dass sie die Laufzeit eines Ziels verarbeiten soll, selbst wenn das Ziel komplexe Abhängigkeiten hat.

Antwort

3

Das srcs Attribut genrule nicht runfiles Baum für Binärdateien bauen. Bazel nur einen runfiles Baum bauen, wenn es etwas erwartet, dass binäre auf dem Host-System als Teil des Build-oder Tests auszuführen. Stattdessen können wir das tools-Attribut genrule verwenden, das für Binärdateien gedacht ist, die als Teil der Genrule ausgeführt werden. Die folgenden genrule werden die Python-Binärdatei und ihre Runfiles-Struktur zusammenführen.

genrule(
    name = "zip_foo", 
    tools = ["//python:foo"], 
    outs = ["foo.zip"], 
    cmd = "zip -r [email protected] $(location //python:foo)*", 
) 

HAFTUNGSAUSSCHLUSS: Diese //python:foo in der "Host-Konfiguration" bauen. Dies bedeutet, dass jeder native Code für die Architektur der Maschine erstellt wird, auf der Sie Bazel ausführen. Wenn Sie also foo.zip unter Linux erstellen und auf einen Mac kopieren, wird es wahrscheinlich nicht funktionieren.

+0

Das ist in Ordnung, ich benutze diese in einer CI-Pipeline, die die gleiche Architektur wie die Implementierungsumgebung verwendet. Vielen Dank. – Arthelais

Verwandte Themen