আমাদের উদাহরণস্বরূপ প্রকল্পটির দুটি বিল্ড টার্গেট রয়েছে: হ্যালোওয়ার্ল্ড.অ্যাপ এবং হেল্পার.অ্যাপ। আমরা প্রত্যেকের জন্য একটি উপাদান প্যাকেজ তৈরি করি এবং তাদেরকে একটি পণ্য সংরক্ষণাগারে মিশ্রিত করি ।
কোনও উপাদান প্যাকেজটিতে ওএস এক্স ইনস্টলার দ্বারা ইনস্টল করার জন্য পে-লোড রয়েছে। যদিও কোনও উপাদান প্যাকেজটি নিজেই ইনস্টল করা যেতে পারে, এটি সাধারণত কোনও পণ্য সংরক্ষণাগারে অন্তর্ভুক্ত করা হয় ।
একটি সফল "বিল্ড এবং সংরক্ষণাগার" এর পরে টার্মিনালে $ BUILT_PRODUCTS_DIR খুলুন।
$ cd ~/Library/Developer/Xcode/DerivedData/.../InstallationBuildProductsLocation
$ pkgbuild --analyze --root ./HelloWorld.app HelloWorldAppComponents.plist
$ pkgbuild --analyze --root ./Helper.app HelperAppComponents.plist
এটি আমাদের উপাদান সরবরাহ করে, আপনি "উপাদান উপাদান তালিকা" বিভাগে মান বর্ণনা পান । pkgbuild -root উপাদান প্যাকেজ উত্পন্ন করে , যদি আপনার কোনও ডিফল্ট বৈশিষ্ট্য পরিবর্তন করার প্রয়োজন না হয় তবে আপনি নিম্নলিখিত কমান্ডে --comp घटक-plist পরামিতি বাদ দিতে পারেন ।
প্রোডাক্ট বিল্ড - সংশ্লেষিত ফলাফলগুলি বিতরণের সংজ্ঞাতে আসে ।
$ pkgbuild --root ./HelloWorld.app \
--component-plist HelloWorldAppComponents.plist \
HelloWorld.pkg
$ pkgbuild --root ./Helper.app \
--component-plist HelperAppComponents.plist \
Helper.pkg
$ productbuild --synthesize \
--package HelloWorld.pkg --package Helper.pkg \
Distribution.xml
ইন Distribution.xml আপনি শিরোনাম, পটভূমি, স্বাগতম, রিডমি, লাইসেন্স, ইত্যাদি ভালো জিনিস পরিবর্তন করতে পারেন। আপনি এই আদেশটি দিয়ে আপনার উপাদান প্যাকেজগুলি এবং বিতরণ সংজ্ঞাটিকে পণ্য সংরক্ষণাগারে পরিণত করেন :
$ productbuild --distribution ./Distribution.xml \
--package-path . \
./Installer.pkg
আমি কী সম্ভব তা দেখতে আইটিউনস ইনস্টলার্স ডিস্ট্রিবিউশন.এক্সএমএল একবার দেখার পরামর্শ দিই recommend আপনি এর সাথে "ইনস্টল করুন আইটিউনস.পিকিজি" বের করতে পারেন:
$ pkgutil --expand "Install iTunes.pkg" "Install iTunes"
এটি একসাথে রাখা যাক
আমার প্রজেক্টে সাধারণত প্যাকেজ নামে একটি ফোল্ডার থাকে যা ডিস্ট্রিবিউশন.এক্সএমএল, উপাদান-প্লিস্টস, সংস্থানসমূহ এবং স্ক্রিপ্টগুলির মতো জিনিস অন্তর্ভুক্ত করে।
"উত্পন্ন প্যাকেজ" নামে একটি রান স্ক্রিপ্ট বিল্ড ফেজ যুক্ত করুন, যা ইনস্টল করার সময় কেবল স্ক্রিপ্ট রান করতে সেট করা হয় :
VERSION=$(defaults read "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/Contents/Info" CFBundleVersion)
PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
TMP1_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp1.pkg"
TMP2_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp2"
TMP3_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp3.pkg"
ARCHIVE_FILENAME="${BUILT_PRODUCTS_DIR}/${PACKAGE_NAME}.pkg"
pkgbuild --root "${INSTALL_ROOT}" \
--component-plist "./Package/HelloWorldAppComponents.plist" \
--scripts "./Package/Scripts" \
--identifier "com.test.pkg.HelloWorld" \
--version "$VERSION" \
--install-location "/" \
"${BUILT_PRODUCTS_DIR}/HelloWorld.pkg"
pkgbuild --root "${BUILT_PRODUCTS_DIR}/Helper.app" \
--component-plist "./Package/HelperAppComponents.plist" \
--identifier "com.test.pkg.Helper" \
--version "$VERSION" \
--install-location "/" \
"${BUILT_PRODUCTS_DIR}/Helper.pkg"
productbuild --distribution "./Package/Distribution.xml" \
--package-path "${BUILT_PRODUCTS_DIR}" \
--resources "./Package/Resources" \
"${TMP1_ARCHIVE}"
pkgutil --expand "${TMP1_ARCHIVE}" "${TMP2_ARCHIVE}"
# Patches and Workarounds
pkgutil --flatten "${TMP2_ARCHIVE}" "${TMP3_ARCHIVE}"
productsign --sign "Developer ID Installer: John Doe" \
"${TMP3_ARCHIVE}" "${ARCHIVE_FILENAME}"
প্যাকেজটি প্রোডাক্ট বিল্ড দিয়ে তৈরি করার পরে যদি আপনাকে পরিবর্তন না করতে হয় তবে আপনি এগুলিpkgutil --expand
এবং pkgutil --flatten
পদক্ষেপগুলি থেকে মুক্তি পেতে পারেন । এছাড়াও আপনি পণ্য -সাইন চালানোর পরিবর্তে পণ্য- বিল্ডে - সাইন প্যারামেন্টার ব্যবহার করতে পারেন ।
একটি ওএস এক্স ইনস্টলারে স্বাক্ষর করুন
বিকাশকারী আইডি ইনস্টলার শংসাপত্রের সাথে প্যাকেজগুলি স্বাক্ষরিত হয় যা আপনি বিকাশকারী শংসাপত্রের ইউটিলিটি থেকে ডাউনলোড করতে পারেন ।
তারা সাইন ইন করার সময় সম্পন্ন করা হয় --sign "Developer ID Installer: John Doe"
যে পরামিতি pkgbuild , productbuild বা productsign ।
মনে রাখবেন যে আপনি যদি পণ্য বিল্ড ব্যবহার করে একটি স্বাক্ষরিত পণ্য সংরক্ষণাগার তৈরি করতে চলেছেন তবে উপাদান প্যাকেজগুলিতে স্বাক্ষর করার কোনও কারণ নেই ।
সমস্ত উপায়: প্যাকেজটি Xcode সংরক্ষণাগারে অনুলিপি করুন
এক্সকোড সংরক্ষণাগারে কোনও কিছু অনুলিপি করতে আমরা রান স্ক্রিপ্ট বিল্ড ফেজ ব্যবহার করতে পারি না । এর জন্য আমাদের একটি স্কিম অ্যাকশন ব্যবহার করা প্রয়োজন।
স্কিম সম্পাদনা করুন এবং সংরক্ষণাগারটি প্রসারিত করুন। তারপরে পোস্ট-অ্যাকশনগুলি ক্লিক করুন এবং একটি নতুন রান স্ক্রিপ্ট অ্যাকশন যুক্ত করুন :
এক্সকোড 6 এ:
#!/bin/bash
PACKAGES="${ARCHIVE_PATH}/Packages"
PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
ARCHIVE_FILENAME="$PACKAGE_NAME.pkg"
PKG="${OBJROOT}/../BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"
if [ -f "${PKG}" ]; then
mkdir "${PACKAGES}"
cp -r "${PKG}" "${PACKAGES}"
fi
এক্সকোড 5 এ পরিবর্তনের জন্য এই মানটি ব্যবহার PKG
করুন:
PKG="${OBJROOT}/ArchiveIntermediates/${TARGET_NAME}/BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"
যদি আপনার সংস্করণ নিয়ন্ত্রণ Xcode স্কিম তথ্য সংরক্ষণ না করে তবে আমি এটিকে আপনার প্রকল্পে শেল স্ক্রিপ্ট হিসাবে যুক্ত করার পরামর্শ দিচ্ছি যাতে আপনি কার্যক্ষেত্র থেকে স্ক্রিপ্টটিকে পোস্ট-অ্যাকশনে টেনে এ্যাকশনটি পুনরুদ্ধার করতে পারেন।
স্ক্রিপ্টিং
দুটি ভিন্ন ধরণের স্ক্রিপ্টিং রয়েছে: বিতরণ সংজ্ঞা ফাইল এবং শেল স্ক্রিপ্টগুলিতে জাভাস্ক্রিপ্ট ।
শেল স্ক্রিপ্ট সম্পর্কে সেরা ডকুমেন্টেশন যা আমি হোয়াইটবক্সে পেয়েছি - প্যাকেজমেকার কীভাবে তা , তবে এটি সাবধানতার সাথে পড়ুন কারণ এটি পুরানো প্যাকেজ ফর্ম্যাটকে বোঝায়।
অতিরিক্ত পড়া
জ্ঞাত সমস্যা এবং কাজের ক্ষেত্র
গন্তব্য নির্বাচন ফলক
ব্যবহারকারীকে কেবল একটি একক পছন্দ - "এই কম্পিউটারের সমস্ত ব্যবহারকারীর জন্য ইনস্টল করুন" সহ গন্তব্য নির্বাচন বিকল্পের সাথে উপস্থাপন করা হবে। বিকল্পটি দৃশ্যত নির্বাচিত প্রদর্শিত হবে, তবে ব্যবহারকারীকে ইনস্টলেশনটি চালিয়ে যাওয়ার জন্য এটিতে ক্লিক করা দরকার, এতে কিছু বিভ্রান্তি দেখা দিয়েছে।
অ্যাপল ডকুমেন্টেশন ব্যবহার করার পরামর্শ দেয় <domains enable_anywhere ... />
তবে এটি নতুন আরও বগি ডেস্টিনেশন সিলেক্ট ফলকে ট্রিগার করে যা অ্যাপল তাদের কোনও প্যাকেজগুলিতে ব্যবহার করে না।
অবচয় ব্যবহার করে <options rootVolumeOnly="true" />
আপনাকে পুরানো গন্তব্য নির্বাচন ফলক দেয়।
আপনি বর্তমান ব্যবহারকারীর হোম ফোল্ডারে আইটেমগুলি ইনস্টল করতে চান।
সংক্ষিপ্ত উত্তর: এটি চেষ্টা করবেন না!
দীর্ঘ উত্তর: সত্যিই; এটি চেষ্টা করবেন না! ইনস্টলার সমস্যা এবং সমাধান পড়ুন । তুমি জানো আমি এই পড়েও কি করেছি? আমি এটি চেষ্টা করার জন্য যথেষ্ট বোকা ছিল। নিজেকে বলছি আমি নিশ্চিত যে তারা সমস্যাগুলি 10.7 বা 10.8 এ স্থির করেছে।
সবার আগে আমি সময়ে সময়ে উল্লিখিত গন্তব্য নির্বাচন পেন বাগটি দেখেছি। এটি আমাকে থামিয়ে দেওয়া উচিত ছিল, তবে আমি এটিকে উপেক্ষা করেছি। আপনি যদি আপনার সফ্টওয়্যার সমর্থন ই-মেইলের উত্তর প্রদানের পরে সপ্তাহটি কাটাতে না চান তবে সুন্দর নীল নির্বাচনটি একবার এটি ব্যবহার করবেন না they
আপনি এখন ভাবছেন যে আপনার ব্যবহারকারীরা প্যানেলটি বের করার জন্য যথেষ্ট স্মার্ট, তাই না? ঠিক আছে এখানে হোম ফোল্ডার ইনস্টলেশন সম্পর্কে অন্য জিনিস, তারা কাজ করবেন না!
আমি এটি প্রায় দুই সপ্তাহ ধরে প্রায় 10 টি বিভিন্ন মেশিনে বিভিন্ন ওএস সংস্করণ এবং কী না তা পরীক্ষা করে দেখেছিলাম এবং এটি কখনও ব্যর্থ হয়নি। সুতরাং আমি এটি প্রেরণ। মুক্তির এক ঘন্টার মধ্যে আমি কেবল ব্যবহারকারীদের কাছ থেকে ফিরে এসেছি যারা কেবল এটি ইনস্টল করতে পারেনি। অনুমতি সম্পর্কিত ইঙ্গিতযুক্ত লগগুলি আপনি ঠিক করতে সক্ষম হবেন না।
সুতরাং আসুন এটি আরও একবার পুনরাবৃত্তি করুন: আমরা হোম ফোল্ডার ইনস্টলেশনগুলির জন্য ইনস্টলারটি ব্যবহার করি না!
ওয়েলকাম, রিড-মি, লাইসেন্স এবং উপসংহারের জন্য আরটিএফডি গ্রহণ করে না productbuild
।
চিত্র ইনস্টল করে চমত্কার ওয়েলকাম স্ক্রিন তৈরি করতে আর্টিএফডি ফাইলগুলি শুরু থেকেই ইনস্টলার সমর্থিত, তবে প্রোডাক্ট বিল্ড সেগুলি গ্রহণ করে না।
কর্মক্ষেত্র: একটি ডামি আরটিএফ ফাইল ব্যবহার করুন এবং এটি productbuild
সম্পন্ন হওয়ার পরে প্যাকেজটিতে প্রতিস্থাপন করুন ।
দ্রষ্টব্য: আরটিএফডি ফাইলের অভ্যন্তরে আপনার রেটিনা চিত্র থাকতে পারে। এই জন্য বহু-ইমেজ টিফ ফাইলে ব্যবহার করুন: tiffutil -cat Welcome.tif Welcome_2x.tif -out FinalWelcome.tif
। আরও বিশদ ।
কোনও বান্ডেলপস্টইনস্টলস্ক্রিপ্টপথ স্ক্রিপ্ট দিয়ে ইনস্টলেশন সম্পন্ন হলে একটি অ্যাপ্লিকেশন শুরু করা :
#!/bin/bash
LOGGED_IN_USER_ID=`id -u "${USER}"`
if [ "${COMMAND_LINE_INSTALL}" = "" ]
then
/bin/launchctl asuser "${LOGGED_IN_USER_ID}" /usr/bin/open -g PATH_OR_BUNDLE_ID
fi
exit 0
অ্যাপ্লিকেশনটি ইনস্টলারের ব্যবহারকারীর হিসাবে নয়, লগ ইন হওয়া হিসাবে চালানো গুরুত্বপূর্ণ important এটি লঞ্চক্টেল asuser uid পাথ দিয়ে সম্পন্ন হয় । এছাড়াও আমরা কেবল এটি চালিত করি যখন এটি কোনও কমান্ড লাইন ইনস্টলেশন না হয়, ইনস্টলার সরঞ্জাম বা অ্যাপল রিমোট ডেস্কটপ দিয়ে সম্পন্ন হয় ।