Xcode'dan Bazel'e taşıma

Bu sayfada Bazel ile Xcode projesinin nasıl oluşturulacağı veya test edileceği açıklanmaktadır. Bu rehberde, Xcode ve Bazel arasındaki farkların yanı sıra Xcode projesini Bazel projesine dönüştürme adımları açıklanmıştır. Ayrıca yaygın hataları ele almak için sorun giderme çözümleri de sunar.

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 bir şekilde belirtmenizi gerektirir.

  • Bazel, projenin çalışma alanı dizininde bulunmasını veya WORKSPACE dosyasında içe aktarma olarak belirtilmesini gerektirir.

  • Bazel ile Xcode projeleri oluştururken BUILD dosyaları bilgi kaynağı olur. Xcode'da proje üzerinde çalışıyorsanız BUILD dosyalarını her güncellediğinizde Tulsi kullanarak BUILD dosyalarıyla eşleşen yeni bir Xcode projesi sürümü oluşturmanız gerekir. Xcode kullanmıyorsanız bazel build ve bazel test komutları, bu kılavuzun ilerleyen bölümlerinde açıklanan belirli sınırlamalarla geliştirme ve test etme özellikleri sunar.

  • Derleme yapılandırması şemalarındaki (dizin düzenleri veya derleme işaretleri gibi) farklılıklar nedeniyle Xcode, derlemenin "büyük resmi"nin tam olarak farkında olmayabilir ve bu nedenle bazı Xcode özellikleri çalışmayabilir. Bunlara örnek olarak şunlar verilebilir:

    • Tulsi'de dönüşüm için seçtiğiniz hedeflere bağlı olarak Xcode, proje kaynağını düzgün bir şekilde dizine ekleyemeyebilir. Xcode, projenin kaynak kodunun tamamını göremeyeceği için bu durum, Xcode'da kod tamamlama ve gezinmeyi etkiler.

    • Bazel, Xcode'un bu özellikler için beklediği çıktıları üretmediği için statik analiz, adres temizleyiciler ve iş parçacığı temizleyiciler çalışmayabilir.

    • Tulsi ile bir Xcode projesi oluşturur ve bu projeyi Xcode içinden test çalıştırmak için kullanırsanız Xcode, testleri Bazel yerine çalıştırır. Bazel ile test çalıştırmak için bazel test komutunu manuel olarak çalıştırın.

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 uygulama eğitimini tamamlayın.) WORKSPACE ve BUILD dosyalarını da içeren 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'dan farklı olarak Bazel, BUILD dosyasındaki her hedef için tüm bağımlılıkları açık bir şekilde tanımlamanızı gerektirir.

Dış bağımlılıklar hakkında daha fazla bilgi için Dış bağımlılıklarla çalışma bölümüne bakın.

Bazel ile Xcode projesi oluşturma 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) CocoaPods bağımlılıklarını entegre etme

  3. Bir 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ırın

  5. Derlemeyi çalıştırma

  6. Xcode projesini Tulsi ile 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. Proje hiçbir harici bağımlılık kullanmıyorsa bu dosya boş bırakılabilir. Proje, projenin dizinlerinden birinde bulunmayan dosyalara veya paketlere bağımlıysa bu harici bağımlılıkları WORKSPACE dosyasında belirtin.

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

CocoaPods bağımlılıklarını Bazel çalışma alanına entegre etmek için bunları CocoaPods bağımlılıklarını dönüştürme bölümünde açıklandığı gibi 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şturmanız gerekir. BUILD dosyasını Bazel çalışma alanının kök dizininde oluşturun ve projeyi ilk derlemesini yapmak için aşağıdaki gibi 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 başlıklı makaleyi inceleyin.

3a Adımı: Uygulama hedefini ekleyin

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

  • bundle_id - ikili programın paket kimliği (ters DNS yolu ve ardından uygulama adı).

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

  • families (yalnızca iOS) - Uygulamanın iPhone, iPad veya her ikisi için mi geliştirileceğini belirtir.

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

  • minimum_os_version: Uygulamanın desteklediği minimum macOS veya iOS sürümü. Bu, Bazel'ın uygulamayı doğru API düzeyleriyle derlemesini sağlar.

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

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

  • macOS'te kitaplık tabanlı ve uygulama tabanlı birim testleri çalıştırmak için macos_unit_test.

  • iOS'te kitaplığa dayalı birim testleri çalıştırmak için ios_unit_test. iOS simülatörünün kullanılmasını gerektiren testlerde, Bazel test çıkışlarını oluşturur ancak testleri çalıştırmaz. Tulsi ile bir Xcode projesi oluşturmanız ve testleri Xcode içinden çalıştırmanız gerekir.

  • ios_ui_test: Xcode kullanarak iOS simülasyon aracında kullanıcı arayüzü testleri çalıştırmak için gereken çıkışları oluşturun. Tulsi ile bir Xcode projesi oluşturmanız ve testleri Xcode içinden çalıştırmanız gerekir. Bazel, kullanıcı arayüzü testlerini yerel olarak çalıştıramaz.

En azından minimum_os_version özelliği için bir değer belirtin. bundle_identifier ve infoplists gibi diğer paketleme özellikleri varsayılan olarak en sık kullanılan değerleri kullanır. Ancak bu varsayılan değerlerin projeyle uyumlu olduğundan emin olun ve gerekli şekilde düzenleyin. iOS simülatörünün kullanılmasını gerektiren testlerde, test_host özelliğinin değeri olarak ios_application hedef adını da belirtin.

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

Her Hedef 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.

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

  • Üstbilgileri hdrs özelliğinde listeleyin.

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

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 veya büyüdükçe, birden fazla Bazel paketine bölmeyi düşünün. Bu artırılmış ayrıntı düzeyi şunları sağlar:

  • Derlemelerin artımlılığı,

  • Derleme görevlerinin daha paralel 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ı içeren kitaplıkların genel API'lere sızması gibi sorunları önler.

Projeyi ayrıntılandırmak için ipuçları:

  • Her kitaplığı kendi Bazel paketine yerleştirin. En az bağımlılığa ihtiyaç duyanlarla başlayın ve bağımlılık ağacının üst sıralarına doğru ilerleyin.

  • BUILD dosyaları ekleyip hedefler belirttikçe, bu yeni hedefleri bunlara bağlı olan hedeflerin deps özelliklerine ekleyin.

  • glob() işlevi paket sınırlarını aşmaz. Bu nedenle, paket sayısı büyüdükçe glob() ile eşleşen dosyalar küçülür.

  • main dizinine BUILD dosyası eklerken, ilgili test dizinine de BUILD dosyası ekleyin.

  • 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 oluşturun ve karşılaştığınız derleme hatalarını düzeltin.

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

Tamamen taşınan derlemeyi çalıştırarak hata veya uyarı olmadan tamamlandığından emin olun. Oluşabilecek hataların kaynaklarını daha kolay bulmak için her uygulamayı çalıştırın ve hedefi ayrı ayrı test edin.

Örneğin:

bazel build //:my-target

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

Bazel ile derleme yaparken WORKSPACE ve BUILD dosyaları derlemeyle ilgili doğru kaynak olur. Xcode'un bundan haberdar olması için Tulsi'yi kullanarak Bazel uyumlu bir Xcode projesi oluşturmanız gerekir.

Sorun giderme

Seçilen Xcode sürümüyle senkronizasyonu bozulduğunda (ör. bir güncelleme uyguladığınızda), Bazel hataları ortaya çıkabilir. Xcode'da hatalarla karşılaşıyorsanız deneyebileceğiniz bazı adımlar şunlardır: "Apple CROSSTOOL kullanmak için Xcode sürümü belirtilmelidir".

  • Xcode'u manuel olarak çalıştırıp şartlar ve koşulları kabul edin.

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

  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.