سلسلة شروحات innoSetup الدرس العاشر : صناعة ملف التثبيت عن طريق الأكواد قسم [dirs] + قسم [files]

ناصر بعزيز

Administrator
طاقم الإدارة
إنضم
7 أغسطس 2018
المشاركات
646
مستوى التفاعل
666
النقاط
93
الإقامة
الجزائر
الموقع الالكتروني
mx-blind.com
الجنس
ذكر
نظام التشغيل
Windows10
قارئ الشاشة المستخدم
jaws
بسم الله الرحمن الرحيم, والصلاة والسلام على أشرف الخلق والمرسلين
أما بعد فأيها الأحباب أهلا وسهلا بكم في الدرس العاشر من دورة تعلم برنامج InnoSetup

إليكم الدرس الثالث لنهار اليوم
حيث أنا أعجل في الدورة لأني لم أنشر دروس منذ زمن وأرى أن الدورة أخذت وقت أكثر مما تستحق بكثير.
ففي درسنا هذا سنتعرف على قسمين أحدهما مهم جدا والثاني مساعد
حيث القسم المهم هو الذي يسمح لنا بإضافة ملفات إلى معالج التثبيت
أعني ملفات البرنامج ومجلداته
أما عن القسم الثاني فهو الذي يسمح لنا بإنشاء مجلدات فارغة لكي نتعامل معها بأي شكل من الأشكال
لنبدأ أولا بالقسم المهم وهو
قسم
[files]
وإلى تعريف هذا القسم
يسمح لنا قسم [files] بإضافة ملفات برنامجنا إلى ملف التثبيت
بحيث يتم تجميعها في ملف تنفيذي واحد ويتم تثبيتها


وأظن أن لا يحتاج تفصيل كبير
لذا هيا بنا إلى المثال الأول الذي سنقوم بشرح أعناصره
لنتوكل على الله

[Files]
Source: "CTL3DV2.DLL"; DestDir: "{sys}"; Flags: onlyifdoesntexist uninsneveruninstall
Source: "MYPROG.EXE"; DestDir: "{app}"
Source: "MYPROG.CHM"; DestDir: "{app}"
Source: "README.TXT"; DestDir: "{app}"; Flags: isreadme

حيث نلاحظ عدد من الملفات مع أكواد مختلفة
لنبدأ الآن تقسيم هذه الأكواد
أول عنصر لدينا هو

Source
مطلوب
حيث هنا نكتب مسار الملف الذي نريد تجميعه
فمثلا يمكن أن نجمع الملفات والمجلدات التي نريدها
ويمكننا استخدام البدل أو المتغيرات
حيث مثلا *.* ستجلب جميع الملفات في المجلد المحدد
*.exe ستجلب جميع الملفات التنفيذية إلخ
*
ستجلب جميع المجلدات الموجودة
ملاحظة : في حال كانت الملفات والمجلدات إلى جانب ملف السكربت يكفي كتابة أسمائها بدون مسار
فكمثال نأخذ
Source: "install\*"
حيث يجلب جميع المحتويات الموجودة في مجلد install سواءا كانت ملفات أو مجلدات
Source: "install\*.*"
يجلب جميع الملفات الموجودة في مجلد install
Source: "install\*.exe"
يجلب جميع الملفات التي بصيغة exe الموجودة في مجلد install
Source: "c:\install\*"
حيث يجلب جميع المحتويات الموجودة في مجلد install الموجود في القرص c: سواءا كانت ملفات أو مجلدات

DestDir
مطلوب
وهو الخيار الذي يسمح لنا بإعطائه مكان الإستخراج
مثلا
في مجلد التطبيق الذي اخترناه في قسم setup
يكفي كتابة {app}
هذه
المتغيرات التي نحتاجها سأضعها في درس مستقل بعد إنتهاء أقسام الدورة وسأفصل فيها إن شاء الله

في حال لم يكن المجلد المختار موجود سيتم إنشائه
وحذفه بعد إزالة التثبيت في حال كان فارغ

طبعا علينا أن نركز في هذه النقطة
وإليكم مثال
Source: "install\*"; DestDir: "{app}"
Source: "install\help\*.*"; DestDir: "{app}\help"


الآن لننتقل إلى عنصر آخر وهو


حيث هذا يستخدم في حال أردنا تغيير إسم الملف بعد تثبيته
حيث افتراضية يقوم بأخذ الإسم الأصلي للملف أو المجلد ويمكننا إعادة تسميته من خلال هذا القسم
مثال
Source: "install\ReadMe.TXT"; DestDir: "{app}"; DestName: "ReadMeNewName.txt"

والآن إلى عنصر جديد وهو

Excludes
حيث يسمح لنا باستبعاد صيغ معينة من التجميع
فَرَضا عندنا مجلد نريد تجميعه لاكن لا نريد تجميع ملفات محددة
فهنا بإمكاننا فعل ذالك

قد تتضمن المتغيرات أحرف البدل ("*" و "؟"). لاحظ أنه على عكس قسم Source ، يتم استخدام روتين مطابقة لنمط Unix البسيط للاستثناءات. النقاط الموجودة في النموذج مهمة دائمًا ، وبالتالي "*. *" لن تستبعد ملفًا بدون امتداد (بدلاً من ذلك ، استخدم فقط "*"). أيضًا ، تتطابق علامات الاستفهام دائمًا مع حرف واحد تمامًا ، وبالتالي "؟؟؟؟؟" لن يستبعد الملفات ذات الأسماء التي يقل طولها عن خمسة أحرف.

إذا بدأ نمط بقاطعة خلفية ("\") يتم مطابقته مع بداية اسم المسار ، وإلا فسيتم مطابقة مع نهاية اسم المسار. وبالتالي "\foo" ستستبعد فقط ملفًا باسم "foo" في قاعدة الشجرة. من ناحية أخرى ، يستبعد "foo" أي ملف باسم "foo" في أي مكان في الشجرة.

قد تشمل الأنماط قاطيعات خلفية. يستبعد "foo\bar" كلاً من "foo\bar" و "subdir\foo\bar". يستبعد "\foo\bar" فقط "foo\bar".
هذه الجزئية ستفهموها فقط مع التجريب لذا أنصحكم بالتجريب لأكثر من مرة
Source: "*"; Excludes: "*.~*"
Source: "*"; Excludes: "*.~*,\Temp\*"


ExternalSize
يجب دمج هذه المعلمة مع العلامة (external) وتحديد حجم الملف الخارجي بالبايت. إذا لم يتم تحديد هذه المعلمة ، يسترجع برنامج الإعداد حجم الملف عند بدء التشغيل. مفيد بشكل أساسي للملفات التي لا تتوفر عند بدء التشغيل ، على سبيل المثال الملفات الموجودة على القرص الثاني عند استخدام disk spanning.

مثال
ExternalSize: 1048576; Flags: external

الآن مع
Attribs
حيث من خلال هذا العنصر بإمكاننا تغيير سيمات الملف
حيث يدعم السيمات التالية
readonly, hidden, system, notcontentindexed
يتم الفصل طبعا بين الواحدة والأخرى بالمسافة
يعني يمكن استخدام أكثر من سيمة
ملاحظة :
عدم إستخدام هذا العنصر يعني أن البرنامج لا يقوم بتعديل سيمات الملف الرئيسية.

ومع قسم جديد وهو
Permissions

تستخدم لتحديد أذونات إضافية لمنحها في قائمة التحكم في الوصول (ACL) للملف. لا يوصى باستخدام هذه المعلمة إذا لم تكن معتادًا على قوائم ACL أو كنت لا تحتاج إلى تغييرها ، لأن إساءة استخدامها قد تؤثر سلبًا على أمان النظام.

لكي يكون لهذه المعلمة تأثير ، يجب أن يكون الملف موجودًا على قسم يدعم قوائم ACL (مثل NTFS) ، ويجب أن يكون المستخدم الحالي قادرًا على تغيير الأذونات على الملف. في حالة عدم تلبية هذه الشروط ، لن يتم عرض أي رسالة خطأ ، ولن يتم تعيين الأذونات.

يجب استخدام هذه المعلمة فقط في الملفات الخاصة بالتطبيق الخاص بك. لا تقم أبدًا بتغيير قوائم ACL على ملفات النظام المشتركة ، وإلا يمكنك فتح ثغرات أمنية على أنظمة المستخدمين لديك.

يتم تعيين الأذونات المحددة بغض النظر عما إذا كان الملف موجودًا قبل التثبيت.

يمكن أن تتضمن هذه المعلمة قيمة واحدة أو أكثر مفصولة بالمسافات في هذا التنسيق:

<معرف المستخدم أو المجموعة> - <نوع الوصول>

أنواع الوصول التالية مدعومة لقسم [الملفات]:

full
منح إذن "التحكم الكامل" ، وهو نفس التعديل (لاحظ أدناه) ، ولكن بالإضافة إلى ذلك يتيح للمستخدم / المجموعة المحددة الحصول على ملكية الملف وتغيير أذوناته.

modify
منح إذن "تعديل" ، والذي يسمح للمستخدم / المجموعة المحددة بقراءة الملف وتنفيذه وتعديله وحذفه.

readexec
منح إذن "قراءة وتنفيذ" ، والذي يسمح للمستخدم / المجموعة المحددة بقراءة الملف وتنفيذه.


مثال
Permissions: users-modify
ملاحظة :
أنا قمت بترجمة هذا الإعداد من ملف المساعدة
لأني لا أفهم كثيرا في الصلاحيات والأذنات
لذا لا تؤاخذوني

هيا لنتجاهل بعض العناصر الغير المهمة وننتقل إلى

Flags
حيث هنا يمكننا إضافة خيارات إضافية لاكن مهمة
ويمكن الفصل بين خيار وخيار بالمسافة
ملاحظة :
الخيارات هنا كثيرة جدا
حوالي أربعون خيار
لذا أنا سأنتقي الأهم منهم وسأشاركها معكم
ومن أراد أكثر بإمكانه العودة إلى ملف المساعدة

لنبدأ على بركة الله

32bit
هذا إذا كان الملف يجب أن يثبت في مجلدات 32 فقط
مثل مثلا
program files (86)
وغيره من المسارات التي تختلف بين النمط 32 و 64
حيث أي استخدام للثوابت في العنصر الأول والثاني في هذا القسم يعني
Source و DestDir
يعاد توجيهه إلى ما يقابله في مسارات 32
64bit
هذا إذا كان الملف يجب أن يثبت في مجلدات 64 فقط
مثل مثلا
program files
وغيره من المسارات التي تختلف بين النمط 32 و 64
حيث أي استخدام للثوابت في العنصر الأول والثاني في هذا القسم يعني
Source و DestDir
يعاد توجيهه إلى ما يقابله في مسارات 64


confirmoverwrite
ليطلب من المستخدم الموافقة على استبدال الملف في حال وجوده

createallsubdirs
لإنشاء جميع المجلدات في حال كان مجلدات فارغة توجد في المسار المحدد
تستخدم في حال قمت بإضافة مجلد
حيث افتراضيا لا يقم بأخذ المجلدات الفارغة

deleteafterinstall
لحذف الملف بعد التثبيت
حيث هذا يساعد في حذف الملف بعد الإنتهاء من تثبيت البرنامج
إذ تستخدم هذه في حال كان الملف من بين الملفات المؤقتة التي تريد التعامل معها أثناء التثبيت فقط

dontcopy
حيث هذا سيؤدي إلى تجميع الملف ولاكن لا يقوم باستخراجه بالطريقة العادية
هذه تساعد في حال كنا نريد التعامل مع الملف من قسم الأكواد
يعني مثلا الملفات الصوتية التي ترفق التثبيت
أو ملفات الصور في حال أردنا عرض صور توضح طريقة التثبيت مثلا

external
هذه جميلة جدا
حيث لو عندنا برنامج كبير
ولا نريد دمجه في ملف واحد
مثل مثلا برنامج office
فبهذا الخيار نأمر البرنامج بعدم تجميع الملف داخله إنما يقوم بتثبيته من المسار الذي حددناه سابقا

isreadme
هذا يجعل الملف المحدد هو الملف المخصص ليلعب دور ملف إقرأني
حيث تقبل هذه القيمة أن تكن موجودة في ملف واحد فقط
عند تنفيذها
سيسألك البرنامج إذا كنت تريد عرض ملف إقرأني بعد الإنتهاء من التثبيت

nocompression
حيث تستخدم لمنع البرنامج من ضغط الملف الحالي حيث يبقى بحجمه الطبيعي
هذا مناسب مع الصور
في حال خفت أن تفقد جودتها مثلا


onlyifdestfileexists
حيث هذا الخيار يعني أن الملف يثبت فقط في حال كان موجود بالفعل عند المستخدم
تفيد هذه مثلا في حال كان الملف هذا عبارة عن تحديث لملف سابق ففيحال عدم وجود الملف لا داعي لتثبيته

onlyifdoesntexist
سيقوم بتثبيت الملف فقط في حال لم يكن موجود
هذا الخيار مناسب في حال كنت لا تريد استبدال الملف السابق بل تريد فقط إيضافته في حال عدم وجوده

recursesubdirs
هذا الخيار يفيد عندما نريد إضافة مجلدات تحتوي على مجلدات فرعية
فباستخدامه
مثلا لو نقل له جمع كل الملفات التي امتدادها exe
فسيقوم بالبحث أيضا في المجلدات الفرعية

regserver
مفيدة مع ملفات dll
حيث يقوم بتسجيل الملف في النظام بعد تثبيته
مثلا كملف AcaTTsSapi5.dll
في آلة infovox هذا سيقوم بتسجيله في السابي

وعند إيزالة التثبيت سيقوم بإلغاء تسجيله تلقائيا

replacesameversion
هذا في حال استخدامه وكان الملف موجود بالفعل
فسيقوم بالمقارنة
ويستبدله فقط إذا كان المحتوى مختلف

restartreplace
هذا في حال كان الملف موجود ومستخدم من برامج أخرى مثلا
فإنه إذا لم يستخدم فسيظهر رسالة خطأ إلى المستخدم
أما في حال استخدامه فسيقوم تلقائيا بمطالبة المستخدم بإعادة التشغيل بعد الإنتهاء من التثبيت وسيقوم بتثبيت الملف بعد إعادة التشغيل تلقائيا

sharedfile
هذا يعني أن الملف مشارك مع برامج أخرى
فعند إزالة التثبيت لا يقم بحذفه إلا في حال لم يكن يستخدم

skipifsourcedoesntexist
افتراضيا لو كنت تعمل بطريقة التثبيت الخارجي
فسيظهر البرنامج رسالة خطأ عند عدم العثور على الملف
لاكن بهذه الطريقة
سيقم بتجاهله في حال عدم وجوده

uninsneveruninstall
هذا يعني عدم حذف الملف بعد إزالة التثبيت


مثال
Source: "install\ReadMe.TXT"; DestDir: "{app}"; DestName: "ReadMeNewName.txt"; Flags: isreadme createallsubdirs
أنصحكم إخواني بزيارة ملف المساعدة للفهم أكثر في هذا القسم
أنا لم أتطرق إليه كليا

طبعا هنا وجب أن أقول بإمكانك استخدام
Components
لربطه مع ملحق معين كمثلا
Components: helpFile
أو
Components: helpFile Full
وكذالك بإمكانك ربطه مع
tasks
لكي يكن مقرون بمربع تحديد معين
كمثلا
tasks: "InstallFiles"

كما يمكنك ربطه بالخيارات الثلاث التي نذكرها دائما
وهي اللغة أدنى إصدار الإصدار ما بعد
هاك مثال كامل كي تفهم
Source: "install\ReadMe.TXT"; DestDir: "{app}"; DestName: "ReadMeNewName.txt"; Flags: isreadme createallsubdirs; Components: helpFile Full; tasks: "InstallFiles"; Languages: arabic english; MinVersion: 6.1; OnlyBelowVersion: 6.2

إنتهينا الآن من هذا القسم
هيا إلى القسم الأخير

وهو قسم
[Dirs]
حيث يستخدم لإنشاء المجلدات الفارغة
لاستخدامها في عملية التثبيت أو بعد
وإعداداته بسيطة جدا
أولا هاك مثال
[Dirs]
Name: "{app}\data"
Name: "{app}\bin"


ثانيا إلى الإعدادات

Name
مطلوب
وهو مسار المجلد واسمه
مثلا
Name: "{app}\MyDir"

Attribs
لوضع سيمات مخصصة
بإمكانك العودة إلى القسم السابق للمعرفة أكثر
مثلا
Name: "{app}\MyDir"; Attribs: hidden system

Permissions
لإضافة أذونات مخصصة للمجلد
عد إلى القسم السابق لتعرف أكثر

مثال
Name: "{app}\MyDir"; Attribs: hidden system; Permissions: users-modify

Flags
الخيارات الإضافية
حيث يمكن الفصل بين إعداد وآخر بالمسافة
deleteafterinstall
للحذف بعد التثبيت

uninsalwaysuninstall
يعني حذف المجلد بعد إزالة التثبيت على أي حال

uninsneveruninstall
يعني عدم حذف المجلد بعد إزالة التثبيت

مثلا

Name: "{app}\MyDir"; Attribs: hidden system; Permissions: users-modify; Flags: uninsneveruninstall
طبعا مثل سابقه بإمكانك استخدام
tasks
Components
والخيارات الثلاث المرتبطة
كاللغة وأدنى إصدار وأعلى إصدار

لا داعي لمثال هنا أكيد تعودتم عليها
أما الآن لم يتبقى لي سوى أن أقول لكم
أتمنا أن تكن الدورة تفيد على الأقل عدد قليل منكم
ولا تنسوني من خالص دعائكم
وفضلا قوموا بنشر هذه الدورة على أوسع نطاق لكي يستفيد منها أكبر عدد ممكن.
في الختام أستودعكم الله الذي لا تغيب ودائعه
والسلام عليكم ورحمة الله.
كان معكم أخوكم في الله
ناصر بعزيز
 
ما شاء الله على الروعة والجمال وعلى الإبداع
مبدع ومتميز ومتألق دائما أخي العزيز ناصر
حقيقةً شرح رائع جدا إستفدتُ منهُ كثيرا
شكرا جزيلا لك
وجزاك الله كل خير
وفي إنتظار مزيدا من الإبداع
تقبل تحياتي.
 
جزيت خيرا أخي ناصر على الموضوع الرائع وعلى الدورة المتميزة
تحياتي لك
 
نفعنا الله بعلمك أخي الفاضل وأرجو من الله العلي القدير أن يجمعنا في الفردوس الأعلى وأن يختم لنا بالحسنى
 
عودة
أعلى