Quy trình đóng gói và phân phối thư viện iOS nội bộ với CocoaPods

1. Thiết lập Repo Spec (Thư mục chỉ mục từ xa)

Mỗi thành phần (component) trong CocoaPods đều yêu cầu một tệp .podspec để mô tả siêu dữ liệu. Repo Spec là nơi lưu trữ tập trung các tệp này. Để chia sẻ thư viện trong nội bộ tổ chức, chúng ta cần tạo một Repo Spec riêng tư (Private Spec Repo) trên hệ thống quản lý mã nguồn (như GitLab, GitHub hoặc Bitbucket).

Sau khi khởi tạo repository trên Git, hãy sao chép URL của Repo Spec này để sử dụng cho việc đồng bộ ở bước tiếp theo.

2. Đồng bộ Repo Spec về máy cục bộ

Để CocoaPods có thể nhận diện được Repo Spec riêng tư, ta cần thêm nó vào danh sách repo cục bộ trên máy phát triển.

Kiểm tra danh sách repo hiện có:

pod repo list

Thêm Repo Spec từ xa vào máy cục bộ:

pod repo add InternalSpecs https://gitlab.com/your-org/internal-specs.git

Lưu ý: Tên InternalSpecs sẽ được dùng để tham chiếu trong các lệnh sau này. Nên đặt tên gợi nhớ và đồng nhất với tên repo trên Git.

Thư mục vật lý của các repo này được lưu trữ tại ~/.cocoapods/repos/. Trên macOS, bạn có thể hiển thị các thư mục ẩn trong Finder bằng lệnh:

defaults write com.apple.finder AppleShowAllFiles -boolean true && killall Finder

3. Khởi tạo Repository chứa mã nguồn (Source Repo)

Tương tự như Repo Spec, bạn cần tạo một repository Git riêng biệt để lưu trữ mã nguồn thực tế của thư viện. Ví dụ, tạo một repository tên là CoreUIComponents và lấy URL clone của nó.

4. Tạo dự án thư viện cục bộ

Di chuyển đến thư mục làm việc và sử dụng CocoaPods để sinh ra cấu trúc dự án mẫu:

pod lib create CoreUIComponents

Trình hướng dẫn trên terminal sẽ hỏi một số cấu hình (ngôn ngữ, framework, v.v.). Sau khi hoàn tất, một workspace Xcode sẽ được tạo ra.

Xóa tệp ReplaceMe.m mặc định và đưa mã nguồn component của bạn vào thư mục CoreUIComponents/Classes/. Tiếp theo, di chuyển vào thư mục Example và cài đặt các dependency để liên kết mã nguồn:

cd Example
pod install

5. Cấu hình và Kiểm thử tệp Podspec

Mở tệp CoreUIComponents.podspec và cập nhật các thông tin cần thiết. Dưới đây là một mẫu cấu hình đã được tinh chỉnh cho môi trường doanh nghiệp:

Pod::Spec.new do |spec|
  spec.name         = 'CoreUIComponents'
  spec.version      = '1.0.0'
  spec.summary      = 'Bộ thư viện UI tái sử dụng cho các dự án nội bộ.'
  spec.description  = <<-DESC
    Cung cấp các custom views, buttons và utilities giúp tăng tốc độ phát triển giao diện người dùng.
  DESC

  spec.homepage     = 'https://gitlab.com/your-org/core-ui-components'
  spec.license      = { :type => 'Proprietary', :text => 'Copyright 2023. All rights reserved.' }
  spec.author       = { 'Mobile Team' => 'mobile-dev@company.com' }
  spec.source       = { :git => 'https://gitlab.com/your-org/core-ui-components.git', :tag => spec.version.to_s }

  spec.ios.deployment_target = '13.0'
  spec.swift_version = '5.0'

  spec.source_files = 'CoreUIComponents/Classes/**/*.{h,m,swift}'
  
  # Cấu hình tài nguyên (ảnh, xib, v.v.)
  spec.resource_bundles = {
    'CoreUIAssets' => ['CoreUIComponents/Assets/**/*.{png,jpg,xib,storyboard}']
  }

  # Thư viện hệ thống
  spec.frameworks = 'UIKit', 'CoreGraphics'
  
  # Các thư viện bên thứ ba phụ thuộc
  spec.dependency 'Alamofire', '~> 5.6'
  spec.dependency 'SnapKit', '~> 5.6'
  
  # Cấu hình biên dịch tùy chỉnh
  spec.pod_target_xcconfig = { 
    'DEFINES_MODULE' => 'YES',
    'IPHONEOS_DEPLOYMENT_TARGET' => '13.0'
  }
end

Kiểm tra tính hợp lệ của tệp podspec ở môi trường cục bộ:

pod lib lint CoreUIComponents.podspec --allow-warnings

6. Đẩy mã nguồn và gắn thẻ (Tag) phiên bản

Sau khi kiểm tra biên dịch thành công, commit mã nguồn và tạo tag trùng khớp với spec.version (ở đây là 1.0.0):

git add .
git commit -m "Initial release of CoreUIComponents"
git remote add origin https://gitlab.com/your-org/core-ui-components.git
git push -u origin main

git tag 1.0.0
git push origin 1.0.0

7. Phát hành lên Repo Spec nội bộ

Khác với pod lib lint (chỉ kiểm tra cục bộ), pod spec lint sẽ kiểm tra cả tính hợp lệ của URL từ xa và tag trên Git:

pod spec lint CoreUIComponents.podspec --allow-warnings

Nếu không có lỗi, đẩy tệp podspec lên Repo Spec nội bộ đã thiết lập ở Bước 2:

pod repo push InternalSpecs CoreUIComponents.podspec --allow-warnings

8. Tích hợp và Gỡ lỗi thư viện

Để sử dụng thư viện trong các dự án khác, thêm source repo vào Podfile:

source 'https://gitlab.com/your-org/internal-specs.git'
source 'https://github.com/CocoaPods/Specs.git'

target 'MyApp' do
  pod 'CoreUIComponents', '~> 1.0.0'
end

Khi cần cập nhật hoặc gỡ lỗi mã nguồn của thư viện (development pod), trỏ trực tiếp đến đường dẫn cục bộ trong Podfile:

pod 'CoreUIComponents', :path => '../CoreUIComponents'

Sau khi sửa đổi, chạy pod install để áp dụng. Nếu muốn đồng bộ lại repo từ xa sau khi có bản cập nhật mới, dùng lệnh:

pod repo update InternalSpecs

9. Phát hành công khai lên CocoaPods (Tùy chọn)

Nếu thư viện là mã nguồn mở và bạn muốn chia sẻ với cộng đồng, hãy sử dụng CocoaPods Trunk. Đăng ký tài khoản Trunk:

pod trunk register developer@email.com 'Developer Name' --description='MacBook Pro'

Xác thực email từ hệ thống và kiểm tra thông tin tài khoản:

pod trunk me

Đẩy thư viện lên hệ thống Trunk công khai:

pod trunk push CoreUIComponents.podspec --allow-warnings

Thẻ: iOS CocoaPods Swift objective-c Componentization

Đăng vào ngày 6 tháng 8 lúc 16:54