Lane — Fastlane میں ایک نامی آٹومیشن سیناریو ہے جو موبائل ایپلیکیشن کی تعمیر، جانچ یا ترسیل کے لیے اعمال (actions) کی ترتیب کو یکجا کرتا ہے۔ ہر lane Ruby زبان میں Fastfile میں بیان کیا جاتا ہے اور ٹرمینل یا CI/CD سسٹم سے ایک کمانڈ سے چلایا جا سکتا ہے۔ Fastlane Docs, 2025 کے مطابق، 85% Fastfile CI/CD کے مختلف مراحل کے لیے تین سے زیادہ lanes پر مشتمل ہوتے ہیں۔ Lane پیرامیٹرز لے سکتا ہے، دوسرے lanes کو کال کر سکتا ہے اور رن ٹائم ایررز کو ہینڈل کر سکتا ہے۔
اہم نکات
Lane — Fastlane کا بنیادی تعمیراتی بلاک ہے، جو ایک نامی آٹومیشن سیناریو کی وضاحت کرتا ہے۔ ہر lane ایک مخصوص مقصد حاصل کرنے کے لیے اعمال (actions) کی ترتیب بیان کرتا ہے: ایپلیکیشن بنانا، ٹیسٹ چلانا، اسٹور پر اپ لوڈ کرنا یا ماحول ترتیب دینا۔ Lane Fastfile میں اعلان کیا جاتا ہے اور پروجیکٹ کی جڑ سے fastlane [lane_name] کمانڈ سے چلایا جاتا ہے۔
Lane کا تصور Ruby DSL سے لیا گیا ہے اور سیناریوز کی پڑھنے کی اہلیت کو یقینی بناتا ہے۔ ڈیولپر پورے CI/CD عمل کو سمجھنے والے ناموں اور پیرامیٹرز کے ساتھ actions کالز کی ترتیب کے طور پر دیکھتا ہے۔ Lane سادہ (ایک کمانڈ) یا پیچیدہ (برانچنگ، لوپس، دوسرے lanes کو کال کرنا) ہو سکتا ہے۔
ہر lane چلانے کے بعد ایک نتیجہ لوٹاتا ہے — ایک آبجیکٹ جس میں عملدرآمد کی حالت اور actions سے ڈیٹا ہوتا ہے۔ نتیجہ دوسرے lanes میں استعمال کیا جا سکتا ہے یا فیصلہ لینے کے لیے CI/CD سسٹم کو بھیجا جا سکتا ہے۔ اگر lane میں کوئی بھی action ایرر کے ساتھ ختم ہوتا ہے تو lane کا عملدرآمد رک جاتا ہے اور error بلاک کو کال کیا جاتا ہے۔
Lane کے اعلان کا نحو Ruby DSL کے سادہ نمونے کی پیروی کرتا ہے: lane کلیدی لفظ، Ruby علامت (symbol) کے طور پر سیناریو کا نام، do ... end بلاک جس میں سیناریو کا باڈی ہوتا ہے۔ Lane کا نام پلیٹ فارم کے اندر منفرد ہونا چاہیے اور حروف، اعداد اور زیریں خطوط پر مشتمل ہونا چاہیے۔
Lane کا چلانا کمانڈ لائن کے ذریعے کیا جاتا ہے: fastlane build (:build نامی lane کے لیے) یا bundle exec fastlane build (اگر Fastlane Bundler کے ذریعے انسٹال کیا گیا ہو)۔ پلیٹ فارم lanes کے لیے fastlane ios build یا fastlane android build استعمال کریں۔
# ایک سادہ lane کا اعلان
lane :test do
scan(scheme: 'App', devices: ['iPhone 15'])
end
lane :build_and_deploy do
cocoapods
test
gym(scheme: 'App', export_method: 'app-store')
pilot(skip_waiting_for_build_processing: true)
end
# چلانا: fastlane build_and_deploy
Lane پیرامیٹرز یا ماحولیاتی متغیرات پر مبنی مشروط منطق پر مشتمل ہو سکتا ہے۔ مخصوص شرائط میں مراحل کو چھوڑنے کے لیے if/unless استعمال کریں۔ arrays کو پروسیس کرنے کے لیے each لوپس بھی دستیاب ہیں، جو ایک ہی lane میں متعدد اہداف یا ایپلیکیشن اسکیمز بنانے کے لیے مفید ہے۔
Lane ایک قدر لوٹا سکتا ہے جو کال کرنے والے کوڈ کے لیے قابل رسائی ہوگی۔ قدر لوٹانے کے لیے عام Ruby return یا lane بلاک میں آخری اظہار استعمال کریں۔ لوٹائی گئی قدر ایک سٹرنگ، نمبر، hash یا action کا نتیجہ ہو سکتی ہے۔ یہ ایک lane کے نتیجے کو فیصلہ لینے کے لیے دوسرے lane میں استعمال کرنے کی اجازت دیتا ہے۔
مثال کے طور پر، :get_version lane Info.plist سے ایپلیکیشن کا موجودہ ورژن لوٹا سکتا ہے، اور :deploy lane اسے Slack میں پیغام فارمیٹ کرنے کے لیے استعمال کر سکتا ہے۔ لوٹائی گئی قدریں خاص طور پر private lanes میں مفید ہیں، جہاں نتیجہ کال کرنے والے lane میں مزید پروسیسنگ کے لیے درکار ہوتا ہے۔
Lane پیرامیٹرز سیناریوز کو لچکدار اور دوبارہ استعمال کے قابل بناتے ہیں۔ Lane کمانڈ لائن سے چلاتے وقت options hash کے ذریعے پیرامیٹرز قبول کرتا ہے: fastlane deploy scheme:AppStore version:2.1.0۔ Lane کے اندر، پیرامیٹرز options[:scheme] اور options[:version] کے طور پر قابل رسائی ہیں۔
لازمی پیرامیٹرز کے لیے، lane کے شروع میں قدر کی موجودگی چیک کریں اور واضح پیغام کے ساتھ UI.user_error! کال کریں۔ اختیاری پیرامیٹرز کے لیے || آپریٹر کے ذریعے ڈیفالٹ اقدار مقرر کریں۔ Fastlane قسم، ڈیفالٹ ویلیو اور تفصیل کی وضاحت کے ساتھ options طریقہ کے ذریعے ٹائپ شدہ پیرامیٹرز کو بھی سپورٹ کرتا ہے۔
# پیرامیٹر پروسیسنگ کے ساتھ Lane
lane :deploy do |options|
scheme = options[:scheme]
version = options[:version] || '1.0.0'
beta = options[:beta] || false
UI.user_error!("Scheme متعین نہیں") unless scheme
match(type: beta ? 'adhoc' : 'appstore')
gym(scheme: scheme, export_method: beta ? 'ad-hoc' : 'app-store')
if beta
pilot(distribute_external: true)
else
deliver(submit_for_review: true)
end
end
# چلانا: fastlane deploy scheme:MyApp beta:true version:2.1.0
Lane کے اندر ماحولیاتی متغیرات کے ساتھ کام کرنے کے لیے ENV['VARIABLE_NAME'] استعمال کریں۔ Fastlane خود بخود fastlane ڈائریکٹری سے .env فائلیں لوڈ کرتا ہے۔ یہ حساس ڈیٹا — API کیز، پاس ورڈز اور ٹوکن — کو Fastfile میں محفوظ کیے بغیر CI/CD ماحول میں منتقل کرنے کا معیاری طریقہ ہے۔
مستحکم lane آپریشن کے لیے ان پٹ پیرامیٹرز کی توثیق ضروری ہے۔ اگر لازمی پیرامیٹر غائب ہے یا غلط قسم کا ہے تو مسئلہ کی وضاحت کے ساتھ UI.user_error! استعمال کریں۔ Fastlane options طریقہ فراہم کرتا ہے، جو ہر پیرامیٹر کے لیے قسم (String, Boolean, Integer, Array)، ڈیفالٹ ویلیو اور تفصیل مقرر کرنے کی اجازت دیتا ہے — توثیق lane شروع ہونے پر خود بخود ہو جاتی ہے۔
مزید برآں، سٹرنگ پیرامیٹرز کے لیے verify بلاک کے ذریعے چیک استعمال کیے جا سکتے ہیں: verify do |value| value.length > 0 end۔ غلط فارمیٹ پر Fastlane متوقع فارمیٹ اور فراہم کردہ قدر بتاتے ہوئے واضح پیغام دکھاتا ہے، جو CI/CD ماحول میں ڈیبگنگ کو آسان بناتا ہے۔
Fastlane ہر lane سے پہلے اور بعد میں کوڈ چلانے کے لیے لائف سائیکل ہکس فراہم کرتا ہے۔ before_all بلاک کسی مخصوص پلیٹ فارم پر یا عالمی طور پر ہر lane سے پہلے چلتا ہے۔ after_all بلاک lane کے کامیاب اختتام کے بعد چلتا ہے۔ error بلاک lane کے اندر کسی بھی ایرر پر چلتا ہے۔
ہکس تکراری منطق کو مرکزی بنانے کی اجازت دیتے ہیں: before_all میں ڈیپنڈنسی انسٹالیشن، after_all میں اطلاع بھیجنا، error بلاک میں عارضی فائلوں کی صفائی اور ایرر نوٹیفکیشن۔ یہ کوڈ ڈپلیکیشن کو کم کرتا ہے اور lanes کو صاف ستھرا بناتا ہے۔
# Lanes کے لائف سائیکل ہکس
default_platform(:ios)
before_all do
cocoapods(try_repo_update_on_error: true)
ensure_git_status_clean
end
after_all do |lane|
slack(message: "Lane #{lane} کامیابی سے مکمل ہوا")
end
error do |lane, exception|
slack(
message: "Lane #{lane} خرابی کے ساتھ ناکام ہوا: #{exception}",
success: false
)
end
lane :deploy do
match(type: 'appstore')
gym(export_method: 'app-store')
deliver
end
error بلاک دو آرگیومینٹ لیتا ہے: lane کا نام (symbol) اور exception آبجیکٹ۔ بلاک کے اندر، آپ Slack میں اطلاع بھیج سکتے ہیں، فائل میں لاگ لکھ سکتے ہیں یا متبادل ریکوری سیناریو شروع کر سکتے ہیں۔ اگر error بلاک کامیابی سے ختم ہوتا ہے تو Fastlane بلڈ کو CI/CD سطح پر ناکام نہیں مانتا۔
Private lane — ایک lane ہے جو lane کے بجائے private_lane کے ذریعے اعلان کیا جاتا ہے، جو دستیاب کمانڈز کی فہرست میں ظاہر نہیں ہوتا اور براہ راست ٹرمینل سے نہیں چلایا جا سکتا۔ Private lanes متعدد عوامی lanes سے کال کیے جانے والے تکراری اقدامات کو انکیپسولیٹ کرنے کے لیے ڈیزائن کیے گئے ہیں۔
Private lanes خاص طور پر پیچیدہ ترتیبوں کے لیے مفید ہیں جنہیں سختی سے متعین ترتیب میں انجام دیا جانا چاہیے۔ مثال کے طور پر، :setup_signing private lane مختلف پیرامیٹرز کے ساتھ :build_dev، :build_staging اور :build_production lanes سے کال کیا جا سکتا ہے، لیکن بذات خود ایک علیحدہ کمانڈ کے طور پر معنی نہیں رکھتا۔
# دوبارہ استعمال کے لیے Private lanes
private_lane :setup_environment do |options|
cocoapods(try_repo_update_on_error: true)
match(type: options[:type], readonly: true)
increment_build_number
end
lane :dev_build do
setup_environment(type: 'development')
gym(export_method: 'development')
end
lane :appstore_build do
setup_environment(type: 'appstore')
gym(export_method: 'app-store')
deliver
end
Private lanes دوسرے private lanes کو کال کر سکتے ہیں، ایک تجرید کا درجہ بندی تشکیل دیتے ہوئے۔ Fastfile کی پڑھنے کی اہلیت برقرار رکھنے کے لیے nesting کی گہرائی کو 2–3 سطحوں تک محدود رکھنے کی سفارش کی جاتی ہے۔ ہر private lane کو اس کے مقصد اور متوقع پیرامیٹرز کی تفصیل والے کمنٹ کے ساتھ دستاویز کریں۔
iOS اور Android پروجیکٹس کے لیے عملی مثالیں دیکھتے ہیں۔ iOS lanes عام طور پر ٹیسٹ کے لیے scan، سرٹیفکیٹس کے لیے match، بلڈ کے لیے gym اور ڈیلیوری کے لیے pilot یا deliver استعمال کرتے ہیں۔ Android lanes بلڈ کے لیے gradle، پبلیکیشن کے لیے supply اور کلاؤڈ ٹیسٹنگ کے لیے firebase_test_lab استعمال کرتے ہیں۔
// iOS ایپلیکیشن کے لیے مکمل CI/CD Lane
lane :ci_full_ios do
scan(scheme: 'App', code_coverage: true)
gym(scheme: 'App', export_method: 'app-store')
pilot(distribute_external: true)
slack(message: 'iOS CI/CD کامیابی سے مکمل ہوا')
end
/* Android ایپلیکیشن کے لیے مکمل CI/CD Lane */
lane :ci_full_android do
gradle(task: 'testReleaseUnitTest')
gradle(task: 'bundleRelease')
supply(track: 'internal')
end
iOS اور Android کے لیے lanes کو ملا کر، آپ کراس پلیٹ فارم ایپلیکیشن کے لیے ایک متحد CI/CD عمل بنا سکتے ہیں۔ پلیٹ فارم کے مخصوص lanes کو گروپ کرنے کے لیے platform :ios اور platform :android پلیٹ فارم بلاکس استعمال کریں، اور انہیں مشترکہ آرکیسٹریٹر lane سے کال کریں جو عملدرآمد کی ترتیب کا انتظام کرتا ہے۔
Lanes لکھتے وقت، طریقوں کے ایک سیٹ پر عمل کرنے کی سفارش کی جاتی ہے جو سیناریوز کی پڑھنے کی اہلیت، برقرار رکھنے کی صلاحیت اور بھروسے کو یقینی بناتے ہیں۔ پہلا اصول — ہر lane کو ایک ہی کام انجام دینا چاہیے۔ اگر lane بہت زیادہ کام کرتا ہے تو اسے متعدد lanes اور private lanes میں تقسیم کریں۔
دوسرا اصول — lane کا نام ایک فعل یا فعلی جملہ ہونا چاہیے: build, deploy, test, upload_screenshots۔ process یا do_all جیسے تجریدی ناموں سے پرہیز کریں۔ Lane کے نام میں الفاظ کو الگ کرنے کے لیے زیریں خط استعمال کریں۔
تیسرا اصول — ایررز کو واضح طور پر ہینڈل کریں۔ مسائل کے بارے میں قابل فہم پیغامات کے لیے UI.user_error! استعمال کریں۔ Fastlane کے ڈیفالٹ ایرر میسیجز پر بھروسہ نہ کریں — ڈیولپر کو سیاق و سباق فراہم کریں: «GoogleService-Info.plist فائل نہیں ملی — اسے پروجیکٹ میں شامل کریں» بجائے «فائل نہیں ملی»۔
| طریقہ | تفصیل | مثال |
|---|---|---|
| ایک کام | Lane ایک ہی منطقی آپریشن انجام دیتا ہے | lane :run_tests, lane :build_ipa |
| پیرامیٹرز | تمام سیٹنگز options یا ENV کے ذریعے | options[:scheme] || default |
| ہکس | مشترکہ کوڈ کے لیے before_all/after_all | before_all میں cocoapods |
| تبصرے | پیچیدہ حصوں کو دستاویز کریں | # Bitcode کے ساتھ بلڈ |
| ایررز | قابل فہم ایرر پیغامات | UI.user_error!(«...») |
چوتھا اصول — CI/CD پر چلانے سے پہلے lanes کو مقامی طور پر ٹیسٹ کریں۔ Fastlane --dry-run پرچم کے ذریعے dry-run موڈ کو سپورٹ کرتا ہے، جو دکھاتا ہے کہ کون سے actions انجام دیے جائیں گے بغیر حقیقت میں چلائے۔ انٹیگریشن سے پہلے انفرادی lanes کو الگ تھلگ جانچنے کے لیے fastlane run_test استعمال کریں۔
ہر lane کی دستاویز کرنا ٹیم ڈیولپمنٹ کے لیے ایک اہم عمل ہے۔ Fastlane lane کے اعلان سے پہلے رکھے گئے desc بلاک سے خودکار دستاویزات کی تخلیق کو سپورٹ کرتا ہے۔ desc کا متن fastlane lanes اور fastlane list چلانے پر ظاہر ہوتا ہے، جو ڈیولپرز کو Fastfile کا سورس کوڈ پڑھے بغیر ہر سیناریو کے مقصد کو سمجھنے میں مدد کرتا ہے۔
پیرامیٹرز کو دستاویز کرنے کے لیے، متوقع اقدار کی تفصیل کے ساتھ Ruby تبصرے استعمال کریں۔ Fastlane fastlane generate_docs کمانڈ کے ذریعے lanes کی مکمل فہرست اور ان کی تفصیل کے ساتھ README.md بنا سکتا ہے، جو ٹیم کے نئے اراکین کو پروجیکٹ کے CI/CD عمل سے ہم آہنگ ہونے میں سہولت فراہم کرتا ہے۔
اکثر پوچھے گئے سوالات
Lane — Fastlane میں Ruby کے ساتھ Fastfile میں اعلان کردہ ایک نامی آٹومیشن سیناریو ہے۔ Lane ایک مخصوص کام انجام دینے کے لیے actions کی ایک ترتیب کو یکجا کرتا ہے: ایپلیکیشن بنانا، ٹیسٹ چلانا یا ڈیپلائے کرنا۔ اسے ٹرمینل یا CI/CD سسٹم سے fastlane [lane_name] کے ذریعے چلایا جاتا ہے۔
Fastfile میں lane :name do ... end کا ڈھانچہ استعمال کریں۔ بلاک کے اندر، پیرامیٹرز کے ساتھ actions کالز شامل کریں۔ Lane دوسرے lanes کو نام سے کال کر سکتا ہے۔ چلانے کے لیے، پروجیکٹ کی جڑ سے ٹرمینل میں fastlane name چلائیں، جہاں Fastfile پر مشتمل fastlane ڈائریکٹری موجود ہے۔
پیرامیٹرز کمانڈ لائن کے ذریعے منتقل کیے جاتے ہیں: fastlane build scheme:App version:2.0۔ Lane کے اندر، پیرامیٹرز options[:scheme] اور options[:version] کے ذریعے قابل رسائی ہیں۔ لازمی پیرامیٹرز کے لیے lane کے شروع میں قدر کی موجودگی چیک کریں، اختیاری پیرامیٹرز کے لیے ڈیفالٹ اقدار مقرر کریں۔
Private lane — lane کے بجائے private_lane کے ذریعے اعلان کردہ lane۔ اسے براہ راست کمانڈ لائن سے نہیں چلایا جا سکتا اور یہ دوسرے lanes سے کال کیے جانے والے تکراری اقدامات کو انکیپسولیٹ کرنے کے لیے استعمال ہوتا ہے۔ یہ کوڈ ڈپلیکیشن کو کم کرتا ہے اور Fastfile کی دیکھ بھال کو آسان بناتا ہے۔
استثنیات کو پکڑنے کے لیے عالمی طور پر یا کسی مخصوص lane کے اندر error بلاک استعمال کریں۔ Fastlane بلاک کو lane کا نام اور exception آبجیکٹ بھیجتا ہے۔ بلاک کے اندر، آپ اطلاع بھیج سکتے ہیں، لاگ لکھ سکتے ہیں یا صفائی کر سکتے ہیں۔ قابل فہم ایرر پیغامات بنانے کے لیے UI.user_error! استعمال کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں