নেটওয়ার্কে একটি প্রকল্প ভাগ করা Xcode-কে সরায় না, কারণ অ্যাপটি আপনার Mac-এ চলতে থাকে এবং সার্ভারের কাছে প্রকল্পের ডেটা চাইতে থাকে। দূরবর্তী Mac-এ Xcode চালিয়ে তার স্ক্রিন দেখা ভিন্ন একটি ব্যবস্থা, যেখানে অ্যাপ ও তার ফাইল একসঙ্গে থাকে এবং লিংক কেবল ডিসপ্লে ও আপনার ইনপুট বহন করে। কিছু কনফিগার করার আগে এই দুটির মধ্যে কোনটি চান তা ঠিক করলে পরে যে বিভ্রান্তি হয় তার বেশিরভাগই মিটে যায়।

সাধারণ ক্ষেত্রগুলিকে তিনটি ব্যবস্থা ঢেকে রাখে, আর তারা আলাদা এই দিকে যে ওয়ার্কস্পেস কোথায় থাকে এবং কোন মেশিন কম্পাইল করে। এগিয়ে যাওয়ার আগে এই দুটি প্রশ্নের উত্তর লিখে রাখুন।

Xcode চালানো মেশিনটির নাম দিন

প্রথম ব্যবস্থায় সবকিছু স্থানীয়: চেকআউট, ইনডেক্স ও বিল্ড সবই আপনার Mac-এ থাকে, আর নেটওয়ার্ক কেবল রিপজিটরি ও নির্ভরতার ট্রাফিক বহন করে। দ্বিতীয়টিতে প্রকল্পটি Xcode-সহ দূরবর্তী Mac-এ থাকে, তাই ফাইলের পাশেই ইনডেক্সিং ও কম্পাইলেশন ঘটে, আর লিংক স্ক্রিনের বিষয়বস্তু ও কীস্ট্রোক বহন করে। তৃতীয়টিতে সম্পাদনা স্থানীয়ভাবে হয় এবং স্পষ্ট উৎস হস্তান্তরের পরে একটি দূরবর্তী হোস্টে বিল্ড চলে। টেবিলটি বলে দেয় প্রতিটি ব্যবস্থা কী সরায়।

ArrangementWhere the source livesWhat crosses the link
Everything localLocal diskRepository and dependency traffic
Remote Xcode, screen sharedRemote diskDisplay frames and input events
Local edit, remote buildBoth, with a handoffSource transfer, then build output

প্রথমে মাঝের কলামটি পড়ুন, কারণ এটি ঠিক করে দেয় ব্যর্থতাগুলি কোথায় দেখা দেবে। যে কর্মপ্রবাহের উৎস দূরবর্তী, সেটি লিংক ধীর হলে ব্যর্থ হয়, আর দূরবর্তী কম্পাইলারযুক্ত কর্মপ্রবাহ হস্তান্তর অস্পষ্ট হলে ব্যর্থ হয়। কেবল তৃতীয়টিই আপনাকে দুটির জন্যই দায়ী করে।

রাউন্ড ট্রিপ গুনুন, মেগাবাইট নয়

একটি সম্পাদক ও একটি ইনডেক্সার অনেক ছোট ফাইল অপারেশন চালায়, আর ফাইলসিস্টেম দূরবর্তী হলে প্রতিটি একটি রাউন্ড ট্রিপে পরিণত হয়। এতে মাউন্ট করা ওয়ার্কস্পেস লেটেন্সির প্রতি সংবেদনশীল হয়ে ওঠে, একটি বড় কপি যেমন হয় না, তাই ফাইল স্থানান্তরের সময় মাপলে কর্মপ্রবাহ কেমন লাগে সে সম্পর্কে প্রায় কিছুই জানা যায় না। দূরবর্তী ডিসপ্লের বিপরীত প্রোফাইল: এটি একটি অবিচ্ছিন্ন স্ট্রিম সরায় এবং বিলম্বের চেয়ে থ্রুপুট ভালো সহ্য করে। দুটিকে একটি সংখ্যায় তুলনা করলে আত্মবিশ্বাসী ভুল উত্তর পাওয়া যায়।

কোনো ব্যবস্থাই স্বভাবতই দ্রুততম নয়। সঠিক পছন্দ নির্ভর করে আপনি আসলে যে কাজ করেন তার উপর, তাই পরের ধাপ হল বেঞ্চমার্ক নয়, সেই কাজটিই চেষ্টা করা।

উৎস হস্তান্তর স্পষ্ট করুন

যখন দুটি মেশিনই একটি চেকআউট ধরে রাখে, তখন ঠিক করুন কোনটি কর্তৃত্বপূর্ণ এবং দূরবর্তী বিল্ড কোন সংশোধনী ব্যবহার করেছে। একটি কমিট দুইটি টুলের একটি মাউন্ট করা ওয়ার্কিং ট্রি সম্পাদনার চেয়ে স্পষ্ট হস্তান্তর, কারণ কমিটের একটি পরিচয় আছে আর মাউন্টের নেই। উৎপন্ন আউটপুট ও ইনডেক্স ডেটারও একটি মালিক দরকার, কারণ সেগুলি উৎস থেকে পুনর্নির্মিত হয় এবং উৎসের মতো ভ্রমণ করা উচিত নয়। দ্বিমুখী মিরর সংঘাতের নিয়ম ছাড়া কোনো কর্মপ্রবাহ নয়, এটি একটি প্রতিযোগিতা।

দূরবর্তী বিল্ডের জন্য আরও দরকার দূরবর্তী হোস্টে সঠিক টুলচেইন থাকা এবং ব্যক্তিগত নির্ভরতার জন্য শংসাপত্র। যে VPN আপনাকে হোস্টে পৌঁছাতে দেয়, তা আপনার অ্যাকাউন্ট অ্যাক্সেস ধার দেয় না, আর সেখানে Xcode ইনস্টল করে না।

কর্মপ্রবাহে আবদ্ধ হওয়ার আগে পথটি যাচাই করুন

দূরবর্তী হোস্টকে ঘিরে ডিজাইন করার আগে সেটি যাচাই করুন, তারপর কর্মপ্রবাহ আসলে যে অপারেশনগুলি করবে সেগুলি দিয়ে লিংক মাপুন। নিচের কমান্ডগুলি টুলচেইন, সক্রিয় ডেভেলপার ডিরেক্টরি এবং ফাইল-পর্যবেক্ষণের খরচ যাচাই করে, যা দূরবর্তী ওয়ার্কস্পেসকে যন্ত্রণাদায়ক করে তোলে। শেষটি স্থানীয়ভাবে নয়, নেটওয়ার্ক পথে চালান।

xcode-select -p
xcodebuild -version
ssh mac-builder 'xcodebuild -version'
time git status --porcelain

পূর্ণ Xcode ইনস্টলেশন ছাড়া একটি হোস্ট xcodebuild থেকে ত্রুটি দেয়, আর এটি নেটওয়ার্ক নয় বরং টুলচেইনের সমস্যা। ডেভেলপার ডিরেক্টরি দেখায় বিল্ড কোন Xcode ব্যবহার করবে, আর কেবল কমান্ড-লাইন টুলের দিকে নির্দেশ করা পথ মানে অ্যাপটি ইনস্টল করা নেই। মাউন্ট করা শেয়ারে রিপজিটরি স্ট্যাটাস কমান্ডের সময় মাপলে রাউন্ড-ট্রিপ খরচ সরাসরি প্রকাশ পায়, আর স্থানীয় রানের সঙ্গে তুলনা করলে প্রাসঙ্গিক সংখ্যাটি পাওয়া যায়। এই ব্যবধান ইতিমধ্যেই অপ্রীতিকর হলে, প্রকৃত সম্পাদকের অধীনে মাউন্ট-ওয়ার্কস্পেস কর্মপ্রবাহ আরও খারাপ হবে।

আপনি কোন ব্যবস্থা বেছে নিলেন, কোন মেশিন উৎসের মালিক এবং হস্তান্তর কীভাবে কাজ করে তা লিখে রাখুন। ওই নোট পরের অনবোর্ডিং বা ল্যাপটপ প্রতিস্থাপনকে তদন্তের বদলে একটি কনফিগারেশন কাজে পরিণত করে।

সম্পর্কিত নিবন্ধ