Domande frequenti

Se hai domande o hai bisogno di aiuto, consulta la guida.

Cos'è Bazel?

Bazel è uno strumento che automatizza build e test del software. Le attività di build supportate includono l'esecuzione di compilatori e linker per la produzione di programmi e librerie eseguibili e l'assemblaggio di pacchetti di cui è possibile eseguire il deployment per Android, iOS e altri ambienti di destinazione. Bazel è simile ad altri strumenti come Make, Ant, Gradle, Buck, Pants e Maven.

Cos'ha di speciale Bazel?

Bazel è stato progettato per adattarsi al modo in cui il software è sviluppato da Google. che offre le seguenti funzionalità:

  • Supporto multilingue: Bazel supporta molte lingue e può essere esteso per supportare linguaggi di programmazione arbitrari.
  • Linguaggio di build di alto livello: i progetti sono descritti nel linguaggio BUILD, un formato di testo conciso che descrive un progetto come un insieme di piccole librerie, programmi binari e test interconnessi. Al contrario, con strumenti come Crea, devi descrivere singoli file e chiamate al compilatore.
  • Supporto multipiattaforma: lo stesso strumento e gli stessi file BUILD possono essere utilizzati per creare software per architetture diverse e anche per piattaforme diverse. Noi di Google utilizziamo Bazel per creare qualsiasi cosa, dalle applicazioni server in esecuzione sui sistemi dei nostri data center alle app client in esecuzione sui telefoni cellulari.
  • Riproducibilità: nei file BUILD, ogni libreria, test e programma binario deve specificare completamente le sue dipendenze dirette. Bazel utilizza queste informazioni sulle dipendenze per sapere cosa è necessario ricreare quando apporti modifiche a un file di origine e quali attività possono essere eseguite in parallelo. Ciò significa che tutte le build sono incrementali e producono sempre lo stesso risultato.
  • Scalabilità: Bazel può gestire build di grandi dimensioni; In Google, spesso il programma binario del server ha 100.000 file di origine e le build in cui non sono stati modificati i file richiedono circa 200 ms.

Perché Google non utilizza...?

  • Crea, Ninja: questi strumenti offrono un controllo molto preciso sui comandi che vengono richiamati per creare i file, ma spetta all'utente scrivere le regole corrette.
    • Gli utenti interagiscono con Bazel a un livello superiore. Ad esempio, Bazel ha regole integrate per "Java test", "C++ programmi binari" e nozioni come "piattaforma di destinazione" e "piattaforma host". Queste regole sono state testate in battaglia per essere infallibili.
  • Ant e Maven: Ant e Maven sono principalmente orientate a Java, mentre Bazel gestisce più lingue. Bazel incoraggia la suddivisione dei codebase in unità riutilizzabili più piccole e può ricostruire solo quelle che richiedono la ricostruzione. Questo accelera lo sviluppo quando si lavora con codebase più grandi.
  • Gradle: i file di configurazione di Bazel sono molto più strutturati di quelli di Gradle e consentono a Bazel di capire esattamente cosa fa ogni azione. Ciò consente un maggiore parallelismo e una migliore riproducibilità.
  • Pants, Buck: entrambi gli strumenti sono stati creati e sviluppati rispettivamente da ex Googler su Twitter e Foursquare e su Facebook. Gli accessori sono stati modellati su Bazel, ma i loro set di funzionalità sono diversi, pertanto non sono alternative alternative.

Da dove viene Bazel?

Bazel è uno strumento dello strumento che Google utilizza per creare il proprio software server internamente. Si è ampliato per sviluppare anche altri software, come le app per dispositivi mobili (iOS, Android) che si connettono ai nostri server.

Hai riscritto il tuo strumento interno come open source? È una forcella?

Bazel condivide gran parte del suo codice con lo strumento interno e le regole vengono utilizzate ogni giorno per milioni di build.

Perché Google ha creato Bazel?

Google molto tempo fa ha realizzato il proprio software utilizzando Makefile di grandi dimensioni e generati. con conseguenti rallentamenti e inaffidabili build, che iniziarono a interferire con la produttività degli sviluppatori e con l'agilità dell'azienda. Bazel era un modo per risolvere questi problemi.

Bazel richiede un cluster di build?

Bazel esegue le build a livello locale per impostazione predefinita. Tuttavia, Bazel può anche connettersi a un cluster di build per velocizzare build e test ancora più rapidi. Per maggiori dettagli, consulta la nostra documentazione sulla procedura remota e sulla memorizzazione nella cache e sulla memorizzazione nella cache remota.

Come funziona il processo di sviluppo di Google?

Per il nostro codebase del server, utilizziamo il seguente flusso di lavoro di sviluppo:

  • Tutto il codice del server si trova in un unico sistema di controllo delle versioni.
  • Ognuno crea il proprio software con Bazel.
  • Team diversi possiedono parti diverse della struttura di origine e rendono i propri componenti disponibili come target di BUILD.
  • Il ramo viene utilizzato principalmente per gestire le release, quindi tutti sviluppano il proprio software durante la revisione principale.

Bazel è un pilastro di questa filosofia: dal momento che Bazel richiede che tutte le dipendenze siano completamente specificate, possiamo prevedere quali programmi e test sono interessati da una modifica e controllarli prima dell'invio.

Puoi trovare ulteriori informazioni sul processo di sviluppo in Google sul blog degli strumenti tecnici.

Perché hai aperto Bazel?

Creare software dovrebbe essere semplice e divertente. Le build lente e imprevedibili eliminano il divertimento della programmazione.

Perché dovrei usare Bazel?

  • Bazel potrebbe fornire tempi di compilazione più rapidi perché può ricompilare solo i file che devono essere ricompilati. Allo stesso modo, può ignorare la ripetizione dei test che non ha subito modifiche.
  • Bazel produce risultati deterministici. Ciò elimina la disallineamento tra build incrementali e pulite, laptop e sistemi CI ecc.
  • Bazel può creare diverse app client e server con lo stesso strumento dalla stessa area di lavoro. Ad esempio, puoi modificare un protocollo client/server in un singolo commit e verificare che l'app per dispositivi mobili aggiornata funzioni con il server aggiornato, utilizzando entrambi lo stesso strumento, sfruttando tutti i vantaggi di cui sopra.

Posso vedere esempi?

Sì; consulta un esempio semplice o leggi il codice sorgente Bazel per un esempio più complesso.

Qual è la caratteristica di Bazel?

Bazel punta a creare e testare i progetti con le seguenti proprietà:

  • Progetti con un ampio codebase
  • Progetti scritti in (più) lingue compilate
  • Progetti di cui viene eseguito il deployment su più piattaforme
  • Progetti con test approfonditi

Dove posso eseguire Bazel?

Bazel è in esecuzione su Linux, macOS (OS X) e Windows.

Il trasferimento ad altre piattaforme UNIX dovrebbe essere relativamente facile, a condizione che un JDK sia disponibile per la piattaforma.

Perché non dovrei usare Bazel?

  • Bazel cerca di essere efficiente nella memorizzazione nella cache. Ciò significa che non è valido per eseguire operazioni di compilazione i cui output non devono essere memorizzati nella cache. Ad esempio, i seguenti passaggi non devono essere eseguiti da Bazel:
    • Una compilation che recupera i dati da Internet.
    • Un passaggio di test che si connette all'istanza QA del tuo sito.
    • Un passaggio di deployment che modifica la configurazione del cloud del tuo sito.
  • Se la build è composta da pochi lunghi passaggi sequenziali, Bazel potrebbe non essere molto utile. Avrai più velocità suddividendo lunghi passi in target più piccoli e discreti che Bazel può eseguire in parallelo.

Quanto è stabile il set di funzionalità di Bazel?

Le funzionalità principali (regole C++, Java e shell) sono ampiamente utilizzate in Google, pertanto sono testate accuratamente e il tasso di abbandono è minimo. Allo stesso modo, testiamo nuove versioni di Bazel su centinaia di migliaia di target ogni giorno per trovare regressioni e rilasciamo nuove versioni più volte al mese.

In breve, tranne che per le funzionalità contrassegnate come sperimentali, Bazel dovrebbe funzionare correttamente. Le modifiche alle regole non sperimentali saranno compatibili con le versioni precedenti. Per un elenco più dettagliato degli stati dell'assistenza, consulta il documento di assistenza.

Quanto è stabile Bazel come file binario?

In Google, ci assicuriamo che gli arresti anomali di Bazel siano molto rari. Questo dovrebbe valere anche per il nostro codebase open source.

Come posso iniziare a utilizzare Bazel?

Vedi la Guida introduttiva.

Docker non risolve i problemi di riproducibilità?

Con Docker puoi creare facilmente sandbox con release del sistema operativo fisse, ad esempio Ubuntu 12.04, Fedora 21. Risolve il problema della riproducibilità dell'ambiente di sistema, ovvero "di quale versione /usr/bin/c++ ho bisogno?"

Docker non si occupa della riproducibilità in relazione alle modifiche nel codice sorgente. L'esecuzione di Make con un Makefile scritto in modo errato all'interno di un container Docker può comunque produrre risultati imprevedibili.

All'interno di Google, controlliamo gli strumenti per il controllo del codice sorgente per consentirne la riproduzione. In questo modo, possiamo controllare le modifiche agli strumenti ("esegui l'upgrade di GCC alla versione 4.6.1") con lo stesso meccanismo delle modifiche alle librerie di base ("verifica dei limiti fissi in OpenSSL").

Posso creare programmi binari per il deployment su Docker?

Con Bazel puoi creare programmi binari autonomi e collegati in modo statico in C/C++ e file jar autonomi per Java. Vengono eseguiti con poche dipendenze da normali sistemi UNIX e, di conseguenza, devono essere semplici da installare all'interno di un container Docker.

Bazel ha convenzioni per strutturare programmi più complessi, ad esempio un programma Java che consuma un set di file di dati o esegue un altro programma come sottoprocesso. È possibile pacchettizzare ambienti come archivi autonomi, per eseguirne il deployment su sistemi diversi, comprese le immagini Docker.

Posso creare immagini Docker con Bazel?

Sì, puoi utilizzare le nostre regole Docker per creare immagini Docker riproducibili.

Bazel renderà automaticamente riproducibile le mie build?

Sì, per i programmi binari Java e C++, presumendo di non cambiare la toolchain. Se hai passaggi di build che prevedono ricette personalizzate (ad esempio l'esecuzione di programmi binari tramite uno script shell all'interno di una regola), devi prestare particolare attenzione:

  • Non utilizzare dipendenze che non sono state dichiarate. L'esecuzione con sandbox (–spawn_strategy=sandboxed, solo su Linux) può aiutare a trovare dipendenze non dichiarate.
  • Evita di archiviare timestamp e User-ID nei file generati. I file ZIP e altri archivi sono particolarmente soggetti a questo problema.
  • Evita di collegarti alla rete. Anche l'esecuzione con sandbox può essere d'aiuto.
  • Evita processi che utilizzano numeri casuali, in particolare l'attraversamento del dizionario in modo casuale in molti linguaggi di programmazione.

Hai release binarie?

Sì, puoi trovare i file binari di rilascio più recenti e consultare le nostre norme di rilascio

Utilizzo Eclipse/IntelliJ/XCode. In che modo Bazel interagisce con gli IDE?

Per IntelliJ, consulta il plug-in IntelliJ con Bazel.

Per XCode, consulta Tulsi.

Per Eclipse, controlla il plug-in E4B.

Per conoscere gli altri IDE, consulta il post del blog su come funzionano questi plug-in.

Utilizzo Jenkins/CircleCI/TravisCI. Come fa Bazel a interagire con i sistemi CI?

Bazel restituisce un codice di uscita diverso da zero se la chiamata alla build o al test ha esito negativo e dovrebbe essere sufficiente per l'integrazione CI di base. Poiché Bazel non necessita di build pulite per la correttezza, il sistema CI non deve essere configurato in modo da pulire prima di iniziare una build/esecuzione.

Ulteriori dettagli sui codici di uscita sono disponibili nel Manuale dell'utente.

Quali funzionalità future ci aspettiamo in Bazel?

Consulta la nostra Roadmap.

Posso utilizzare Bazel per il mio progetto INSERT LANGUAGE HERE?

Bazel è estensibile. Chiunque può aggiungere il supporto per le nuove lingue. Sono supportate molte lingue; consulta un'enciclopedia per le build per un elenco di consigli e awesomebazel.com per un elenco più completo.

Se vuoi sviluppare estensioni o scoprirne il funzionamento, consulta la documentazione relativa all'estensione Bazel.

Posso contribuire al codebase Bazel?

Consulta le nostre linee guida per i contributi.

Perché le fasi di sviluppo non sono completate?

Dobbiamo ancora eseguire il refactoring delle interfacce tra il codice pubblico in Bazel e le nostre estensioni interne di frequente. Ciò rende difficile fare molto sviluppo all'aperto.

Hai completato open source Bazel?

L'open source Bazel è in fase di lavorazione. In particolare, stiamo ancora lavorando all'open source:

  • Molti dei nostri test relativi a unità e integrazioni (che dovrebbero semplificare le donazioni).
  • Integrazione IDE completa.

Oltre al codice, vorremmo che tutte le revisioni del codice, il monitoraggio dei bug e le decisioni di progettazione vengano prese pubblicamente, con la community di Bazel coinvolta. Poiché non ci sono ancora, alcune modifiche verranno semplicemente visualizzate nel repository Bazel senza una chiara spiegazione. Nonostante la mancanza di trasparenza, vogliamo supportare gli sviluppatori esterni e collaborare. Pertanto, stiamo aprendo il codice, anche se alcune fasi dello sviluppo sono ancora in corso all'interno di Google. Facci sapere se qualcosa non ti è chiaro o giustificato mentre passiamo a un modello aperto.

Ci sono parti di Bazel che non saranno mai open source?

Sì, parte del codebase si integra con la tecnologia specifica di Google o cercavamo una scusa per liberarsi di (o è una combinazione di questi due approcci). Queste parti del codebase non sono disponibili su GitHub e probabilmente non lo saranno mai.

Come posso contattare il team?

Puoi contattarci all'indirizzo bazel-consider@googlegroups.com.

Dove posso segnalare i bug?

Apri un problema su GitHub.

Qual è il nome della parola "Blaze" nel codebase?

Si tratta di un nome interno dello strumento. Fai riferimento a Bazel come Bazel.

Perché altri progetti Google (Android, Chrome) utilizzano altri strumenti di creazione?

Fino alla prima release (alpha), Bazel non era disponibile esternamente, pertanto non era possibile utilizzare progetti open source come Chromium e Android. Inoltre, la mancanza originale del supporto di Windows era un problema nello sviluppo di applicazioni Windows, come Chrome. Data la maturazione e la maggiore stabilità del progetto, il progetto Android Open Source è in fase di migrazione a Bazel.

Come si pronuncia "Bazel"?

esattamente come "bail" (erba) in inglese americano: "BAY-zel". Fa rima con "nocciola". IPA: /ˈbe←zˌ←l/