Xcode'dan Bazel'e taşıma

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bu sayfada, Bazel ile bir Xcode projesinin nasıl oluşturulacağı veya test edileceği açıklanmaktadır. Google Xcode ve Bazel arasındaki farkları açıklamış ve bir Xcode projesini Bazel projesine dönüştürmek istedik. Ayrıca, sorun giderme adımları da ve yaygın hataları ele almak için çözümler.

Xcode ve Bazel arasındaki farklar

  • Bazel, her derleme hedefini ve derleme hedefini bağımlılıklarını ve derleme kuralları aracılığıyla ilgili derleme ayarlarını görebilirsiniz.

  • Bazel, projenin içinde bulunduğu tüm dosyaların olmasını zorunlu kılar çalışma alanı diziniyle birlikte veya MODULE.bazel dosyası olarak kaydedebilirsiniz.

  • Bazel ile Xcode projeleri oluştururken BUILD dosyaları veri kaynağıdır. Xcode'da proje üzerinde çalışıyorsanız BUILD dosyalarıyla eşleşen Xcode projesinin yeni sürümünü (ör. Xcode projesi için) rules_xcodeproj her BUILD dosyanızı güncellediğinizde kullanabilirsiniz. BUILD dosyalarında yapılan belirli değişiklikler bir hedefe bağımlılık eklemek gibi, tüm öğelerin yeniden oluşturulduğundan hızlandırabilecek bir projedir. Xcode kullanmıyorsanız bazel build ve bazel test komutları, derleme ve test özellikleri sunar belirli sınırlamalara tabi olması gerekir.

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ını eğiticisi) inceleyin. Bazel çalışma alanını bilmeniz gerekir. MODULE.bazel ve BUILD dosyalarını ve Bazel paketlerini kullanabilirsiniz.

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

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

Xcode'dan farklı olarak, Bazel bir web sitesi için tüm bağımlılıkları BUILD dosyasındaki her hedef.

Dış bağımlılıklar hakkında daha fazla bilgi için bkz. Harici bağımlılıklarla çalışma bağımlılıklarını görebilirsiniz.

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. MODULE.bazel dosyasını oluşturun

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

  3. BUILD dosyası oluşturun:

    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ılandırma

  5. Derlemeyi çalıştırma

  6. rules_xcodeproj ile Xcode projesini oluşturma

1. Adım: MODULE.bazel dosyasını oluşturun

Yeni bir dizinde bir MODULE.bazel dosyası oluşturun. Bu dizin Bazel çalışma alanı kökü. Projede harici bağımlılık kullanılmıyorsa bu dosya boş olabilir. Proje, bu harici bağımlılıkları MODULE.bazel dosyası yükleyin.

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

SwiftPM bağımlılarını Bazel çalışma alanına entegre etmek için swift_bazel ise aşağıda açıklandığı şekilde Bazel paketlerine dönüştürebilirsiniz: eğitici içerik ,

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. Şunu oluşturun: BUILD dosyasını kullanarak Bazel çalışma alanının kök düzeyinde şu şekilde açıklayabiliriz:

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

Adım 3a: Uygulama hedefini ekleyin

Bir macos_application 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 - ikilik.

  • 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 - son Info .plist dosyasında 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'ın Apple yapısı kuralları, kullanıcı arayüzü testlerini izleyebilirsiniz. Test hedeflerini aşağıdaki gibi ekleyin:

  • macos_unit_test kullanarak macOS'te kitaplık tabanlı ve uygulama tabanlı birim testleri gerçekleştirebilirsiniz.

  • ios_unit_test kullanarak iOS'te kitaplık tabanlı birim testleri oluşturup çalıştırabilirsiniz.

  • ios_ui_test iOS simülatöründe kullanıcı arayüzü testleri derleyip çalıştırın.

  • Şunun için benzer test kuralları vardır: tvOS, watchOS ve visionOS olarak belirleyin.

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 gerektiren testler için simülatörü için aynı zamanda ios_application hedef adını da test_host özelliği için de geçerlidir.

3c Adımı: Kitaplık hedeflerini ekleyin

Her biri için bir objc_library hedefi ekle Objective-C kitaplığı ve bir swift_library her Swift kitaplığı için hedef belirleyebilirsiniz.

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

  • Uygulama kitaplığı hedeflerini uygulamaya bağımlılık olarak ekleme belirler.

  • 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.

ziyaret edin.

Çeşitli uygulama türleri için mevcut örneklere doğrudan göz atabilirsiniz. rules_apple örnekleri dizinine gidin. Örneğin:

Derleme kuralları hakkında daha fazla bilgi edinmek için Bazel.

Bu noktada, derlemeyi test etmek iyi bir fikirdir:

bazel build //:<application_target>

4. Adım: (İsteğe bağlı) Derlemeyi ayrıntılandırın

Proje büyükse ya da büyüdükçe birden fazla projeye bölebilirsiniz. Bazel paketleri Bu artan ayrıntı düzeyi şunları sağlar:

  • Derlemelerin artımlılığı,

  • Derleme görevlerinde daha fazla paralellik yapılması,

  • 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ın sızdırılmasını içeren kitaplıklar gibi sorunları önler herkese açık API'lere dönüştürebilirsiniz.

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 hedef belirlerken bu yeni hedefleri Kendilerine bağlı hedeflerin deps özelliği.

  • glob() işlevi, paket sınırlarını geçmez ve bu nedenle, paketleri büyütürse 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şikliklerden sonra projeyi oluşturma ve derlemeyi düzeltme gözden geçirmeniz gerekir.

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. Kaynakları daha kolay bulmak için her uygulamayı çalıştırın ve hedefleri tek tek test edin olup olmadığını kontrol edin.

Örneğin:

bazel build //:my-target

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

Bazel ile derleme yaparken MODULE.bazel ve BUILD dosyaları kaynak olur emin olmanız gerekir. Xcode'un bundan haberdar olması için Kullanılan Bazel uyumlu Xcode projesi: rules_xcodeproj ,

Sorun giderme

Seçilen Xcode sürümüyle senkronize olmadığında Bazel hataları ortaya çıkabilir. Örneğin bir güncelleme uygulayabilirsiniz. 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 için Xcode seçme özelliğini kullanın, lisansı kabul edin ve Bazel'in durumunu netleştirmek.

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