Xcode'dan Bazel'e taşıma

Sorun bildirin Kaynağı göster Gece · 7,4 , 7.3 · 7,2 · 7,1 · 7,0 · 6,5

Bu sayfada, Bazel ile Xcode projesinin nasıl derleneceği veya test edileceği açıklanmaktadır. Google Xcode ve Bazel arasındaki farkları açıklamış ve Xcode projesini Bazel projesine dönüştürün. Ayrıca sorun giderme çözümlerini uygulayın.

Xcode ve Bazel arasındaki farklar

  • Bazel, her derleme hedefini ve bağımlılıklarını, ayrıca derleme kuralları aracılığıyla ilgili derleme ayarlarını açıkça belirtmenizi gerektirir.

  • Bazel, projenin var olması gereken tüm dosyaları gerektirir veya WORKSPACE içinde içe aktarma işlemleri olarak belirtilir. dosyası olarak kaydedebilirsiniz.

  • Xcode projeleri Bazel ile derlenirken BUILD dosyaları doğru kaynak olur. Proje üzerinde Xcode'da çalışıyorsanız BUILD dosyalarını her güncellediğinizde rules_xcodeproj dosyasını kullanarak Xcode projesinin BUILD dosyalarıyla eşleşen yeni bir sürümünü oluşturmanız gerekir. Bir hedefe bağımlılık ekleme gibi BUILD dosyalarında yapılan belirli değişiklikler, projenin yeniden oluşturulmasını gerektirmez. Bu da geliştirme sürecini hızlandırabilir. Xcode kullanmıyorsanız bazel build ve bazel test komutları, bu kılavuzun ilerleyen bölümlerinde açıklanan belirli sınırlamalarla derleme ve test özellikleri sağlar.

Başlamadan önce

Başlamadan önce aşağıdakileri yapın:

  1. Henüz yapmadıysanız Bazel'i yükleyin.

  2. Bazel ve kavramlarına aşina değilseniz iOS uygulaması eğitimi. WORKSPACE ve BUILD dosyaları da dahil olmak üzere Bazel çalışma alanını ve hedefler, derleme kuralları ve Bazel paketleri kavramlarını anlamanız gerekir.

  3. Projenin bağımlılıklarını analiz etme ve anlama.

Proje bağımlılıklarını analiz etme

Xcode'un aksine Bazel, BUILD dosyasında her hedef için tüm bağımlılıkları açıkça belirtmenizi gerektirir.

Dış bağımlılıklar hakkında daha fazla bilgi için Dış bağımlılıklarla çalışma.

Bazel ile Xcode projesi derleme veya test etme

Bazel ile bir Xcode projesi oluşturmak veya test etmek için aşağıdakileri yapın:

  1. WORKSPACE dosyasını oluşturma

  2. (Deneysel) SwiftPM bağımlılıklarını entegre etme

  3. BUILD dosyası oluşturma:

    a. Uygulama hedefini ekleme

    b. (İsteğe bağlı) Test hedeflerini ekleyin

    c. Kitaplık hedeflerini ekleme

  4. (İsteğe bağlı) Derlemeyi ayrıntılı hale getirme

  5. Derlemeyi çalıştırma

  6. rules_xcodeproj ile Xcode projesi oluşturma

1. Adım: WORKSPACE dosyasını oluşturun

Yeni bir dizinde bir WORKSPACE dosyası oluşturun. Bu dizin, Bazel çalışma alanı kökü olur. Projede harici bağımlılık yoksa bu dosya boş olabilir. Proje, proje dizinlerinden birinde bulunmayan dosyalara veya paketlere bağlıysa bu harici bağımlılıkları WORKSPACE dosyasında belirtin.

2. Adım: (Deneysel) SwiftPM bağımlılıklarını entegre edin

SwiftPM bağımlılıklarını Bazel çalışma alanına swift_bazel ile entegre etmek için: aşağıdaki eğitimde açıklandığı şekilde bunları Bazel paketlerine dönüştürmeniz gerekir.

3. Adım: BUILD dosyası oluşturun

Çalışma alanını ve harici bağımlılıkları tanımladıktan sonra Bazel'a projenin nasıl yapılandırıldığını bildiren bir BUILD dosyası oluşturun. Bazel çalışma alanının kökünde BUILD dosyasını oluşturun ve projenin ilk derlemesini yapacak şekilde yapılandırın:

İpucu: Paketler ve diğer Bazel kavramları hakkında daha fazla bilgi edinmek için Çalışma alanları, paketler ve hedefler.

3a. adım: Uygulama hedefini ekleyin

macos_application ekleyin veya ios_application kural hedefine gidin. Bu hedef sırasıyla bir macOS veya iOS uygulama paketi oluşturur. Hedefte en azından aşağıdakileri belirtin:

  • bundle_id: İkilinin paket kimliği (tersini alınmış DNS yolu ve ardından uygulama adı).

  • provisioning_profile - Apple Developer'ınızdan temel hazırlık profili hesabı (iOS cihaz için oluşturuyorsanız).

  • families (yalnızca iOS) - iPhone, iPad veya iPhone ya da iPad için uygulama veya her ikisini birden seçebilirsiniz.

  • infoplists: Nihai Info.plist dosyasıyla birleştirilecek .plist dosyalarının listesi.

  • minimum_os_version - destekler. Bu sayede Bazel, uygulamayı ve doğru API düzeylerini belirlemenize yardımcı olur.

3b. adım: (İsteğe bağlı) Test hedeflerini ekleyin

Bazel'in Apple oluşturma kuralları desteği iOS ve macOS'te kitaplık tabanlı birim testleri ve uygulama tabanlı üzerinde çalışıyoruz. iOS'teki uygulama tabanlı testler veya her iki platformdaki kullanıcı arayüzü testleri için Bazel, test çıkışlarını oluşturur ancak testlerin rules_xcodeproj ile oluşturulan bir proje aracılığıyla Xcode'da çalıştırılması gerekir. Test hedeflerini aşağıdaki gibi ekleyin:

En azından, minimum_os_version özelliği için bir değer belirtin. Bu sırada bundle_identifier ve infoplists gibi diğer paketleme özelliklerini en yaygın şekilde kullanılan değerlere varsayılan olarak ayarlayın ve bu varsayılan değerlerin uyumlu olduğundan emin olun. ve gerektiğinde bu değişiklikleri de düzenleyebilirsiniz. iOS simülasyon cihazı gerektiren testler için test_host özelliğinin değeri olarak ios_application hedef adını da belirtin.

3. adım c: Kitaplık hedeflerini ekleyin

Her Objective-C kitaplığı için bir objc_library hedefi ve uygulamanın ve/veya testlerin bağlı olduğu her Swift kitaplığı için bir swift_library hedefi ekleyin.

Kitaplık hedeflerini aşağıdaki gibi ekleyin:

  • Uygulama kitaplığı hedeflerini uygulama hedeflerine bağımlılık olarak ekleyin.

  • Test kitaplığı hedeflerini test hedeflerine bağımlılık olarak ekleyin.

  • srcs özelliğinde uygulama kaynaklarını listeleyin.

  • Başlıkları, hdrs özelliğinde listeleyin.

Çeşitli uygulama türleriyle ilgili mevcut örneklere doğrudan rules_apple örnekler dizininde göz atabilirsiniz. Örneğin:

Derleme kuralları hakkında daha fazla bilgi edinmek için Bazel için Apple Kuralları'na bakın.

Bu aşamada derlemeyi test etmek iyi bir fikirdir:

bazel build //:<application_target>

4. Adım: (İsteğe bağlı) Derlemeyi ayrıntılı hale getirin

Proje büyükse veya büyüyorsa birden fazla Bazel paketine ayırabilirsiniz. Bu artan ayrıntı düzeyi şunları sağlar:

  • Derlemelerin artımlılığı,

  • Derleme görevlerinin paralelleştirilmesi artırıldı.

  • Gelecekteki kullanıcılar için daha iyi sürdürülebilirlik,

  • Hedefler ve paketler genelinde kaynak kodu görünürlüğü üzerinde daha iyi kontrol. Bu, uygulama ayrıntılarını içeren kitaplıkların herkese açık API'lere sızması gibi sorunların önüne geçer.

Projeyi ayrıntılandırmaya yönelik ipuçları:

  • Her kitaplığı kendi Bazel paketine yerleştirin. Birincisi, ikincisi web sitesi en az sayıda bağımlılıkla çalışın ve bağımlılık ağacında yukarılara doğru ilerleyin.

  • BUILD dosyaları ekleyip hedefleri belirtirken bu yeni hedefleri, kendilerine bağlı hedeflerin deps özelliklerine ekleyin.

  • glob() işlevi, paket sınırlarını geçmediğinden sayı oranında paket büyür, glob() ile eşleşen dosyalar küçülür.

  • main dizinine BUILD dosyası eklerken, şuraya BUILD dosyasını da ekleyin: ilgili test dizinini oluşturur.

  • Paketler genelinde sağlıklı görünürlük sınırları uygulayın.

  • BUILD dosyalarında yapılan her büyük değişiklikten sonra projeyi derleyin ve karşılaştığınız derleme hatalarını düzeltin.

5. Adım: Derlemeyi çalıştırın

Hata veya uyarı olmadan tamamlandığından emin olmak için tamamen taşınmış derlemeyi çalıştırın. Ortaya çıkan hataların kaynaklarını daha kolay bulmak için her uygulamayı ve test hedefini ayrı ayrı çalıştırın.

Örneğin:

bazel build //:my-target

6. adım: rules_xcodeproj ile Xcode projesini oluşturun

Bazel ile derleme yaparken WORKSPACE ve BUILD dosyaları, derlemeyle ilgili doğru bilgi kaynağı olur. Xcode'un bundan haberdar olması için rules_xcodeproj kullanan Bazel uyumlu Xcode projesi.

Sorun giderme

Bazel hataları, seçili Xcode sürümüyle senkronizasyonu bozulduğunda (ör. güncelleme uyguladığınızda) ortaya çıkabilir. Aşağıda, Xcode ile ilgili hata oluştu, örneğin "Xcode sürümü Apple CROSSTOOL kullanın".

  • Xcode'u manuel olarak çalıştırın ve tüm hükümler ve koşulları kabul edin.

  • Doğru sürümü belirtmek, lisansı kabul etmek ve Bazel'in durumunu temizlemek için Xcode seçiciyi kullanın.

  sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
  sudo xcodebuild -license
  bazel sync --configure
  • Bu işe yaramazsa bazel clean --expunge komutunu çalıştırmayı da deneyebilirsiniz.
ziyaret edin.