ওয়াইএক্স কৌশল এবং টিপস


264

আমরা এখন থেকে কিছুক্ষণ ওয়াক্স ব্যবহার করে আসছি এবং ব্যবহারের সহজলভ্যতা সম্পর্কে সাধারণ কৌতুক সত্ত্বেও, এটি যুক্তিসঙ্গতভাবে ভাল চলছে। আমি যা খুঁজছি তা সম্পর্কিত দরকারী পরামর্শ:

  • একটি ওয়াইএক্স প্রকল্প সেটআপ করা হচ্ছে (বিন্যাস, তথ্যসূত্র, ফাইলের ধরণ)
  • সমাধানগুলিতে ওয়াইএক্সকে সংহত করা, এবং বিল্ড / রিলিজ প্রক্রিয়া
  • নতুন ইনস্টলেশন ও আপগ্রেডের জন্য ইনস্টলারের কনফিগারেশন
  • যে কোনও ভাল ওয়াক্স হ্যাক আপনি ভাগ করতে চান

gui4wix.codeplex.com
তরুনজি

10
গঠনমূলক না হিসাবে বন্ধ? আমি এই প্রশ্ন জিজ্ঞাসা থেকে স্তূপ শিখেছি! Stackoverflow থেকে একটু দৃঢ়তা এছাড়াও চমৎকার হবে ... যেমন stackoverflow.com/questions/550632/...
si618

15
এটি '203' আপস পেয়েছে, এর কার্যকারিতা প্রমাণ করার জন্য এটি যথেষ্ট।
তরুনজি

সুতরাং প্রশ্নগুলির একটি নির্দিষ্ট, সঠিক উত্তর থাকতে হবে; খোলামেলা প্রশ্নগুলি প্রকৃত সমস্যা সম্পর্কে লোকেদের যে প্রশ্নগুলি জিজ্ঞাসা করে তা প্রথম পৃষ্ঠার বাইরে চলে যায়। FAQ @Si .: নীতি সবসময় সেখানে আমি যতদূর জানি হয়েছে, কিন্তু এটি এখন ভাল জারি হচ্ছে; এই প্রশ্নটি প্রায় তিন বছরের পুরনো।
জিম ড্যাগ

যথেষ্ট পরিমাণে জিম, এটি একটি মুক্ত সমাপ্ত প্রশ্ন, এবং আমি অনুমান করি যে এটি সিদ্ধান্ত নিতে SO সম্প্রদায়ের উপর নির্ভর করে, তবে আমার বলতে হবে যে এটি নির্মাণমূলক নয় বলে বন্ধ করা অদ্ভুত বলে মনে হচ্ছে, আমি এবং এটির চেহারা অনুসারে, আরও অনেক লোক এই প্রশ্নটি দরকারী খুঁজে পেয়েছে (যেমন goo.gl/Zqp2X ), এবং এটি practical, answerable questions based on actual problems that you faceFAQ এর অংশের সাথে খুব ভাল ফিট করে।
si618

উত্তর:


157
  1. পৃথক wxiঅন্তর্ভুক্ত ফাইলটিতে ভেরিয়েবল রাখুন Keep পুনরায় ব্যবহার সক্ষম করে, ভেরিয়েবলগুলি দ্রুততর হয় এবং (যদি প্রয়োজন হয়) বাহ্যিক সরঞ্জাম দ্বারা সহজ ম্যানিপুলেশনের অনুমতি দেয়।

  2. X86 এবং x64 বিল্ডের জন্য প্ল্যাটফর্ম ভেরিয়েবলগুলি সংজ্ঞায়িত করুন

    <!-- Product name as you want it to appear in Add/Remove Programs-->
    <?if $(var.Platform) = x64 ?>
      <?define ProductName = "Product Name (64 bit)" ?>
      <?define Win64 = "yes" ?>
      <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
    <?else ?>
      <?define ProductName = "Product Name" ?>
      <?define Win64 = "no" ?>
      <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
    <?endif ?>
  3. সঠিক অবস্থান সন্ধানের জন্য আপগ্রেড সক্ষম করে রেজিস্ট্রিতে ইনস্টলেশন অবস্থান সংরক্ষণ করুন। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারী কাস্টম ইনস্টল ডিরেক্টরি সেট করে।

     <Property Id="INSTALLLOCATION">
        <RegistrySearch Id="RegistrySearch" Type="raw" Root="HKLM" Win64="$(var.Win64)"
                  Key="Software\Company\Product" Name="InstallLocation" />
     </Property>

    দ্রষ্টব্য : ওয়াইএক্স গুরু রব মেনচিং একটি দুর্দান্ত ব্লগ এন্ট্রি পোস্ট করেছেন যা আরও বিশদে যায় এবং কমান্ড লাইন থেকে বৈশিষ্ট্য নির্ধারিত হয়ে গেলে একটি কিনারা কেস ঠিক করে দেয়।

    উদাহরণস্বরূপ 1. 2. এবং 3 ব্যবহার করে।

    <?include $(sys.CURRENTDIR)\Config.wxi?>
    <Product ... >
      <Package InstallerVersion="200" InstallPrivileges="elevated"
               InstallScope="perMachine" Platform="$(var.Platform)"
               Compressed="yes" Description="$(var.ProductName)" />

    এবং

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="$(var.PlatformProgramFilesFolder)">
        <Directory Id="INSTALLLOCATION" Name="$(var.InstallName)">
  4. সহজ পদ্ধতির সর্বদা বড় আপগ্রেড করা হয় , যেহেতু এটি একক এমএসআইতে নতুন ইনস্টল এবং আপগ্রেড উভয়েরই অনুমতি দেয়। আপগ্রেডকোড একটি অনন্য গাইডে স্থির করা হয়েছে এবং আমরা বিদ্যমান পণ্য আপগ্রেড না করতে চাইলে কখনও পরিবর্তন হবে না।

    দ্রষ্টব্য : ওয়াইএক্স 3.5 তে একটি নতুন মেজর আপগ্রেড উপাদান রয়েছে যা জীবনকে আরও সহজ করে তোলে !

  5. প্রোগ্রামগুলি যোগ / সরান এ আইকন তৈরি করা

    <Icon Id="Company.ico" SourceFile="..\Tools\Company\Images\Company.ico" />
    <Property Id="ARPPRODUCTICON" Value="Company.ico" />
    <Property Id="ARPHELPLINK" Value="http://www.example.com/" />
  6. রিলিজে বিল্ডগুলি আমরা আমাদের ইনস্টলারগুলির সংস্করণ করি, একটি এমএসআই ফাইলটি একটি স্থাপনা ডিরেক্টরিতে অনুলিপি করে। আফটার বিল্ড লক্ষ্য থেকে ডাকা একটি উইক্সপ্রজ টার্গেট ব্যবহার করে এর উদাহরণ:

    <Target Name="CopyToDeploy" Condition="'$(Configuration)' == 'Release'">
      <!-- Note we append AssemblyFileVersion, changing MSI file name only works with Major Upgrades -->
      <Copy SourceFiles="$(OutputPath)$(OutputName).msi" 
            DestinationFiles="..\Deploy\Setup\$(OutputName) $(AssemblyFileVersion)_$(Platform).msi" />
    </Target>
  7. ওয়াইল্ডকার্ড (*) গাইড সহ ফাইলগুলি কাটাতে তাপ ব্যবহার করুন। আপনি যদি একাধিক প্রকল্পের জুড়ে ডাব্লুএক্সএস ফাইলগুলি পুনরায় ব্যবহার করতে চান তবে দরকারী (একই পণ্যটির একাধিক সংস্করণে আমার উত্তর দেখুন)। উদাহরণস্বরূপ, এই ব্যাচ ফাইলটি স্বয়ংক্রিয়ভাবে রোবহেল্প আউটপুট সংগ্রহ করে।

    @echo off  
    robocopy ..\WebHelp "%TEMP%\WebHelpTemp\WebHelp" /E /NP /PURGE /XD .svn  
    "%WIX%bin\heat" dir "%TEMP%\WebHelp" -nologo -sfrag -suid -ag -srd -dir WebHelp -out WebHelp.wxs -cg WebHelpComponent -dr INSTALLLOCATION -var var.WebDeploySourceDir 

    কিছুটা চলছে, robocopyফসল তোলার আগে সাবভার্সন ওয়ার্কিং কপি মেটাডেটা বের করে দিচ্ছে; -drরুট ডিরেক্টরি রেফারেন্স বরং ডিফল্ট TARGETDIR তুলনায় আমাদের ইনস্টলেশন অবস্থান সেট করা হয়; -varউত্স ডিরেক্টরি নির্দিষ্ট করার জন্য একটি ভেরিয়েবল তৈরি করতে ব্যবহৃত হয় (ওয়েব ডিপ্লোমেন্ট আউটপুট)।

  8. স্থানীয়করণের জন্য স্ট্রিংস.ডাব্লুএক্সএল ব্যবহার করে স্বাগত ডায়ালগ শিরোনামে পণ্য সংস্করণটি অন্তর্ভুক্ত করার সহজ উপায়। (ক্রেডিট: সাসাচবিউমন্ট । এই দুর্দান্ত টিপটি একটি মন্তব্যে লুকানো রয়েছে বলে যুক্ত করা হয়েছে)

    <WixLocalization Culture="en-US" xmlns="http://schemas.microsoft.com/wix/2006/localization">
        <String Id="WelcomeDlgTitle">{\WixUI_Font_Bigger}Welcome to the [ProductName] [ProductVersion] Setup Wizard</String>
    </WixLocalization>
  9. নিজেকে কিছুটা ব্যথা বাঁচান এবং প্রতি ফাইলের জন্য একটি উপাদান হিসাবে উইম কোহেনের পরামর্শ অনুসরণ করুন। এটি আপনাকে (বা ওয়াইল্ড-কার্ড *) উপাদান জিইউডি ছাড়ার অনুমতি দেয় ।

  10. এমএসআই লগ ফাইলগুলিতে অনুসন্ধান করে দ্রুত সমস্যাগুলি সন্ধান করার জন্য রব মেনচিংয়ের একটি ঝরঝরে উপায় রয়েছেvalue 3 । আন্তর্জাতিকীকরণ সম্পর্কিত মন্তব্যসমূহ নোট করুন।

  11. শর্তসাপেক্ষ বৈশিষ্ট্যগুলি যুক্ত করার সময়, এটি ডিফল্ট বৈশিষ্ট্য স্তরটি 0 (অক্ষম) এ সেট করা এবং তারপরে আপনার পছন্দসই মানটিতে শর্ত স্তরটি সেট করা আরও স্বজ্ঞাত। আপনি যদি ডিফল্ট বৈশিষ্ট্য স্তর> = 1 সেট করেন তবে এটি অক্ষম করার জন্য শর্তের স্তর 0 হতে হবে, যার অর্থ শর্তের যুক্তিটি আপনার প্রত্যাশার বিপরীত হতে হবে যা বিভ্রান্ত হতে পারে :)

    <Feature Id="NewInstallFeature" Level="0" Description="New installation feature" Absent="allow">
      <Condition Level="1">NOT UPGRADEFOUND</Condition>
    </Feature>
    <Feature Id="UpgradeFeature" Level="0" Description="Upgrade feature" Absent="allow">
      <Condition Level="1">UPGRADEFOUND</Condition>
    </Feature>

প্রোগ্রামগুলি অ্যাড / রিমুভ এ আইকনটি যুক্ত করার বিষয়ে, আমি যা খুঁজছিলাম তা হুবহু এটি। এই তিনটি লাইনে কোথায় থাকো? নিছক দুর্দান্ততার জন্য +1।
এভারেট

আমি এগুলিকে <প্যাকেজ> উপাদানটির ঠিক পরে (এবং স্পষ্টত নীচে) রাখার ঝোঁক রাখছি। Wix.sourceforge.net/manual-wix3/schema_index.htm
si618

+1, যদি আমি +100 করতে পারি তবে এটি উইক্স তথ্যের একমাত্র সবচেয়ে কার্যকর বিট যা আমি হোঁচট খেয়েছি।
টিম লং

ধন্যবাদ টিম! রব মেনসিং, বব আরসন, উইম কোহেন এবং অন্যান্যরা তাদের জ্ঞান ভাগ করে নেওয়ার জন্য কুডোর প্রাপ্য।
si618

38

আইআইএস ইনস্টল করা আছে কিনা তা পরীক্ষা করা হচ্ছে:

<Property Id="IIS_MAJOR_VERSION">
    <RegistrySearch Id="CheckIISVersion" Root="HKLM" Key="SOFTWARE\Microsoft\InetStp" Name="MajorVersion" Type="raw" />
</Property>

<Condition Message="IIS must be installed">
    Installed OR IIS_MAJOR_VERSION
</Condition>

আইআইএস 6 মেটাবেস সামঞ্জস্যতা ভিস্তা + এ ইনস্টল করা আছে কিনা তা পরীক্ষা করা হচ্ছে:

<Property Id="IIS_METABASE_COMPAT">
    <RegistrySearch Id="CheckIISMetabase" Root="HKLM" Key="SOFTWARE\Microsoft\InetStp\Components" Name="ADSICompatibility" Type="raw" />
</Property>

<Condition Message="IIS 6 Metabase Compatibility feature must be installed">
    Installed OR ((VersionNT &lt; 600) OR IIS_METABASE_COMPAT)
</Condition>

34

সমস্ত আইডি পৃথক নেমস্পেসে রাখুন

  • বৈশিষ্ট্যগুলি F. উদাহরণগুলির সাথে শুরু হয় : এফ ডকুমেন্টেশন, এফ.বাইনারিজ, এফ.স্যাম্পলকোড।
  • উপাদানগুলি C. প্রাক্তন: সি.এইচএমফিল, সি। রিলেজ নোটস, সি লিসেন্সফিল, সিআইনিফিল, সি.আরজিস্ট্রি দিয়ে শুরু হয়
  • কাস্টমঅ্যাকশনগুলি হ'ল CA. প্রাক্তন: সিএ.ল্যাঞ্চহেল্প, CA.UpdateReadyDlg, CA.SetPropertyX
  • ফাইলগুলি হয় Fi.
  • ডিরেক্টরি হয় Di.
  • ইত্যাদি।

আমি দেখতে পেয়েছি যে এটি সমস্ত বিভিন্ন বিভাগে বিভিন্ন আইডির ট্র্যাক রাখতে প্রচুর সহায়তা করে।


আমি নেমস্পেস ব্যবহার করি না তবে আমি আইডি সংযোজন করি; উদাহরণস্বরূপ: উদাহরণস্বরূপ, ChmFileComp घटक। আমি অনুমান করি আমি টাইপিং পছন্দ করি ;-)
ডিভিডিভোরলে

25

চমত্কার প্রশ্ন। আমি প্রদর্শিত কিছু সেরা অনুশীলন দেখতে চাই।

আমি বিতরণ করি এমন অনেকগুলি ফাইল পেয়েছি, তাই আমি আমার প্রকল্পটি বেশ কয়েকটি ডাব্লুএক্সএস উত্স ফাইলগুলিতে স্থাপন করেছি।

আমার কাছে একটি শীর্ষ স্তরের উত্স ফাইল রয়েছে যা আমি প্রোডাক্ট ডাব্লুএক্স বলি যা মূলত ইনস্টলেশনের কাঠামো ধারণ করে তবে প্রকৃত উপাদান নয়। এই ফাইলটির কয়েকটি বিভাগ রয়েছে:

<Product ...>
  <Package ...>
    <Media>... 
   <Condition>s ...
   <Upgrade ..>
   <Directory> 
        ...
   </Directory>
   <Feature>
      <ComponentGroupRef ... > A bunch of these that
   </Feature>
   <UI ...>
   <Property...>
   <Custom Actions...>
   <Install Sequences....
  </Package>
</Product>

বাকী .wix ফাইলগুলি এমন টুকরা দ্বারা গঠিত যা কম্পোনেন্টগ্রুপগুলি ধারণ করে যা Product.wxs এর বৈশিষ্ট্য ট্যাগটিতে উল্লেখ করা হয়। আমার প্রকল্পে আমি বিতরণ করা ফাইলগুলির একটি দুর্দান্ত যৌক্তিক গ্রুপিং রয়েছে

<Fragment>
   <ComponentGroup>
     <ComponentRef>
     ....
    </ComponentGroup>
    <DirectoryRef>
      <Component... for each file
      .... 
    </DirectoryRef>
</Fragment>

এটি নিখুঁত নয়, আমার ওও স্পাইডার ইন্দ্রিয়টি খানিকটা টিংগল করে কারণ টুকরাগুলিকে Product.wxs ফাইলের (যেমন ডিরেক্টরীরিফ) নাম উল্লেখ করতে হয় তবে আমি একক বৃহত উত্স ফাইলটি বজায় রাখা আরও সহজ বলে মনে করি।

আমি এই সম্পর্কে মন্তব্য শুনতে ভাল লাগবে, বা কারও খুব ভাল টিপস আছে যদি!


আমাদের সেটআপও এই পদ্ধতির সাথে খুব মিল। এটি ভাল কারণ আমরা বিভিন্ন পণ্যের জন্য আমাদের বেস সেটআপ হিসাবে Products.wxs এর সমতুল্য ব্যবহার করতে পারি।
si618

@ পিটার টেট: আপনার মাকড়সার ধারণাটি সঠিক is ডিরেক্টরি aliasing সম্পর্কে আমার উত্তর দেখুন।
উইম কোইন

আমি একই পন্থা গ্রহণ করি: লেআউট সহ Product.wxs স্থিতিশীল, এবং একটি বিল্ড টাস্ক (হিট.এক্সি) আমার Content.wxs ফাইলটি তৈরি করে
টাইমডব্লু

20

অ্যাপ্লিকেশনটি চালু করতে ডায়ালগ ডায়ালগ বা হেল্পফাইলে একটি চেকবক্স যুক্ত করুন।

...

<!-- CA to launch the exe after install -->
<CustomAction Id          ="CA.StartAppOnExit"
              FileKey     ="YourAppExeId"
              ExeCommand  =""
              Execute     ="immediate"
              Impersonate ="yes"
              Return      ="asyncNoWait" />

<!-- CA to launch the help file -->
<CustomAction Id         ="CA.LaunchHelp"
              Directory  ="INSTALLDIR"
              ExeCommand ='[WindowsFolder]hh.exe IirfGuide.chm'
              Execute    ="immediate"
              Return     ="asyncNoWait" />

<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT"
          Value="Launch MyApp when setup exits." />

<UI>
  <Publish Dialog  ="ExitDialog"
           Control ="Finish"
           Order   ="1"
           Event   ="DoAction"
           Value   ="CA.StartAppOnExit">WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT</Publish>
</UI>

আপনি যদি এইভাবে এটি করেন তবে "মানক" চেহারাটি একেবারেই ঠিক নয়। ডায়ালগটি সাদা থাকাকালীন চেকবাক্সটি সবসময় ধূসর ব্যাকগ্রাউন্ড হয়:

Alt পাঠ্য http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/images/exit_dlg_1.gif

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

var msiOpenDatabaseModeTransact = 1;
var filespec = WScript.Arguments(0);
var installer = new ActiveXObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);
var sql = "UPDATE `Control` SET `Control`.`Height` = '18', `Control`.`Width` = '170'," +
          " `Control`.`Y`='243', `Control`.`X`='10' " +
          "WHERE `Control`.`Dialog_`='ExitDialog' AND " + 
          "  `Control`.`Control`='OptionalCheckBox'";
var view = database.OpenView(sql);
view.Execute();
view.Close();
database.Commit();

এই কোডটি কমান্ড-লাইন স্ক্রিপ্ট হিসাবে চালানো (cscript.exe ব্যবহার করে) এমএসআই তৈরি হওয়ার পরে (লাইট.এক্সে থেকে) একটি এক্সিটডায়ালগ তৈরি করবে যা আরও পেশাদার দেখায়:

Alt পাঠ্য http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/images/exit_dlg_2.gif


হা! আমার ব্লগ না। আমি এটাও পড়েছি। এবং আমার উপরের লেখায় ব্লগ প্রবেশের লিঙ্ক আছে। তবে তারা আমার চেয়ে আলাদাভাবে এটি করেছে। আমি আমার উপায় ভাল পছন্দ। !!
চিজো

1
জেএসের জন্য ধন্যবাদ, খুব সহায়ক! ডাব্লুএক্সএসে আমাকে যে একটি জিনিস বদলাতে হয়েছিল তা হ'ল তার অভ্যন্তরের WIXUI_EXITDIALOGOPTIONALCHECKBOXসাথে প্রতিস্থাপন করা হবেWIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed<Publish>
আলেকজান্ডার কোজেভনিকিকভ

চেক বক্সটি ডিফল্টরূপে চেক করার কোনও উপায় আছে কি?
আলেক ডেভিস

ডিফল্টরূপে বাক্সটি পরীক্ষা করতে, আমি এটি ব্যবহার করেছি: <সম্পত্তি আইডি = "WIXUI_EXITDIALOGOPروعCHECKBOX" মান = "1" />
আলেক ডেভিস

একটি নিফটি সমাধান মত মনে হচ্ছে, কিন্তু আমি কিভাবে এটি ব্যবহার করব? আমার উইক্সপ্রজেজে << আফটারবিল্ড> উপাদানটির ভিতরে জেএস রাখার কোনও উপায় আছে কি? বা যেহেতু আপনি কমান্ড লাইন থেকে এটি চালনার কথা উল্লেখ করেছেন, পোস্ট-বিল্ড ইভেন্ট হিসাবে এটি কি আরও ভাল, সেই ক্ষেত্রে উইন্ডোজের জন্য একটি ভাল জেএস কমান্ড-লাইন ইন্টারপ্রেটার কী?
ভ্যানমেল

18

একই উত্স ফাইলগুলি ব্যবহার করে লাইভ, পরীক্ষা, প্রশিক্ষণ, ... সংস্করণ তৈরি করা হচ্ছে।

সংক্ষেপে: প্রতিটি ইনস্টলারটির জন্য অনন্য আপগ্রেডকোড তৈরি করুন এবং প্রতিটি ইনস্টলারের জন্য প্রতিটি গাইডের প্রথম অক্ষর স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত করুন, বাকি 31 টি স্বতন্ত্র রেখে leaving

পূর্বশর্ত

অনুমিতি

  • ওয়াইএক্স ভেরিয়েবলগুলি আপগ্রেডকোড, প্রোডাক্টনাম, ইনস্টলনাম সংজ্ঞায়িত করতে ব্যবহৃত হয়।
  • আপনার ইতিমধ্যে একটি ওয়ার্কিং ইনস্টলার রয়েছে। আপনি না করা পর্যন্ত আমি এটি চেষ্টা করব না।
  • আপনার সমস্ত উপাদানগুলি একটি ফাইলে রাখা হয়েছে (কম্পোনেন্টস ডাব্লুএক্স)। আপনার একাধিক ফাইল থাকলে এই প্রক্রিয়াটি কাজ করবে, আরও কাজ করার দরকার আছে।

ডিরেক্টরি কাঠামো

  • Setup.Library
    • সমস্ত ডাব্লুএক্সএস ফাইল (উপাদান, বৈশিষ্ট্য, ইউআই ডায়ালগ, ...)
    • সাধারণ.কনফিগ.ডাব্লুএক্সআই (প্রোডাক্টকোড = "*", প্রোডাক্ট ভার্সন, প্ল্যাটফর্মপ্রগ্রামফায়ার ফোল্ডার, ...)
  • সেটআপ.লাইভ (উইক্সপ্রজ)
    • সমস্ত সেটআপ লিঙ্ক করুন। লাইব্রেরি ফাইলগুলি "বিদ্যমান ফাইল যুক্ত করুন" -> "লিঙ্ক হিসাবে যুক্ত করুন" ব্যবহার করে (ভিজুয়াল স্টুডিওতে অ্যাড বোতামের ঠিক সামান্য ডাউন তীর বোতাম)
    • Config.wxi (স্বতন্ত্র আপগ্রেডকোড, পণ্য নাম, ইনস্টলনাম, ...)
  • সেটআপ.টেষ্ট , ...
    • লাইভ অনুসারে কিন্তু কনফিগ ডাব্লু এক্সসি পরীক্ষার পরিবেশের জন্য কনফিগার করা হয়েছে।

প্রক্রিয়া

  • সেটআপ.লাইবারি ডিরেক্টরি তৈরি করুন এবং বিদ্যমান প্রকল্প থেকে আপনার সমস্ত ডাব্লুএক্স এবং ডাব্লুএক্সআই ফাইল (কনফিগারেশন.ওএক্সসি বাদে) সরান।
  • সাধারণ উইক্সপ্রজ অনুযায়ী সেটআপ.লাইভ, সেটআপ. টেস্ট ইত্যাদি তৈরি করুন।
  • সেটআপ.লাইভ ইত্যাদিতে উইক্সপ্রজটিতে বিয়ার্ড বিল্ড যুক্ত করুন, গাইডগুলি সংশোধন করতে এমএসবিল্ড কমিউনিটি টাস্ক ফাইলআপডেট সম্পাদন করতে (প্রশিক্ষণের জন্য আমি লাইভের জন্য বি, বি ব্যবহার করলাম)
  • কম্পোনেন্টস ডাব্লুএক্স গাইডগুলি 0-এ ফিরে যাওয়ার জন্য আফটার বিল্ড লক্ষ্য যুক্ত করুন।
  • অরকা দিয়ে যাচাই করুন যে প্রতিটি এমএসআইয়ের প্রতিটি উপাদানগুলির পরিবর্তিত গাইড রয়েছে।
  • মূল নির্দেশাবলী পুনরুদ্ধার করা হয়েছে তা যাচাই করুন।
  • যাচাই করে নিন যে প্রতিটি এমএসআই সঠিক পণ্য এবং অবস্থান ইনস্টল করছে (এবং আপগ্রেড করছে)।

উদাহরণ কনফিগার করুন। Wxi

<?xml version="1.0" encoding="utf-8"?>
<Include>
<!-- Upgrade code should not change unless you want to install 
     a new product and have the old product remain installed, 
     that is, both products existing as separate instances. -->
<?define UpgradeCode = "YOUR-GUID-HERE" ?>

<!-- Platform specific variables -->
<?if $(var.Platform) = x64 ?>
  <!-- Product name as you want it to appear in Add/Remove Programs-->
  <?define ProductName = "Foo 64 Bit [Live]" ?>
<?else ?>
  <?define ProductName =  "Foo [Live]" ?>
<?endif ?>

<!-- Directory name used as default installation location -->
<?define InstallName = "Foo [Live]" ?>

<!-- Registry key name used to store installation location -->
<?define InstallNameKey = "FooLive" ?>

<?define VDirName = "FooLive" ?>
<?define AppPoolName = "FooLiveAppPool" ?>
<?define DbName = "BlahBlahLive" ?>
</Include>

উদাহরণস্বরূপ কনফিগার.কমন.ডাব্লু

<?xml version="1.0" encoding="utf-8"?>
<Include>
<!-- Auto-generate ProductCode for each build, release and upgrade -->
<?define ProductCode = "*" ?>

<!-- Note that 4th version (Revision) is ignored by Windows Installer -->
<?define ProductVersion = "1.0.0.0" ?>

<!-- Minimum version supported if product already installed and this is an upgrade -->
<!-- Note that 4th version (Revision) is ignored by Windows Installer -->
<?define MinimumUpgradeVersion = "0.0.0.0" ?>

<!-- Platform specific variables -->
<?if $(var.Platform) = x64 ?>
   <?define Win64 = "yes" ?>
   <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
<?else ?>
   <?define Win64 = "no" ?>
   <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
<?endif ?>

<?define ProductManufacturer = "Foo Technologies"?>

<!-- Decimal Language ID (LCID) for the Product. Used for localization. -->
<?define ProductLanguage = "1033" ?>

<?define WebSiteName = "DefaultWebSite" ?>
<?define WebSitePort = "80" ?>

<?define DbServer = "(local)" ?>
</Include>

উদাহরণস্বরূপ Comp घटक.wxs

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <!-- The pre-processor variable which allows the magic to happen :) -->
  <?include $(sys.CURRENTDIR)\Config.wxi?>
  <?include ..\Setup.Library\Config.Common.wxi?>
  <Fragment Id="ComponentsFragment">
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="$(var.PlatformProgramFilesFolder)">
        <Directory Id="INSTALLLOCATION" Name="$(var.InstallName)">
          <Component Id="ProductComponent" Guid="0XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" KeyPath="yes">
          ...

দ্রষ্টব্য: আমি এখন নির্দেশক উপাদানটি কম্পোনেন্টের (সমতুল্য *) বাইরে রেখে উপাদানগুলির জন্য প্রতি একটি ফাইল ব্যবহার করে এবং ফাইলটিকে কীপথ হিসাবে সেট করার পরামর্শ দেব। এটি কল করার প্রয়োজনীয়তা ModifyComponentsGuidsএবং RevertComponentsGuidsনীচে প্রদর্শিত লক্ষ্যগুলি সরিয়ে দেয় । যদিও আপনার সমস্ত উপাদানগুলির জন্য এটি সম্ভব নাও হতে পারে।

উদাহরণ সেটআপ.লাইভ.উইক্সপ্রজ

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
  <CallTarget Targets="ModifyComponentsGuids" />
</Target>
<Target Name="AfterBuild">
  <CallTarget Targets="RevertComponentsGuids" />
</Target>
<!-- Modify the first character of every Guid to create unique value for Live, Test and Training builds -->
<Target Name="ModifyComponentsGuids">
  <FileUpdate Files="..\Setup.Library\Components.wxs" Regex="Guid=&quot;([a-f]|[A-F]|\d)" ReplacementText="Guid=&quot;A" />
</Target>
<!-- Revert the first character of every Guid back to initial value -->
<Target Name="RevertComponentsGuids">
  <FileUpdate Files="..\Setup.Library\Components.wxs" Regex="Guid=&quot;([a-f]|[A-F]|\d)" ReplacementText="Guid=&quot;0" />
</Target>

সর্বশেষ ভাবনা

  • এই প্রক্রিয়াটির একই ইনস্টলারের জন্য বিভিন্ন সংহত মডিউলগুলির জন্য (লাইভ, টেস্ট, ... বৈশিষ্ট্য হিসাবে) বিভিন্ন ইনস্টলার তৈরি করার জন্যও কাজ করা উচিত। এটি একটি নিরাপদ বিকল্প বলে মনে হচ্ছিল বলে আমি বিভিন্ন ইনস্টলারের সাথে গিয়েছিলাম, আরও একই ঝুঁকি রয়েছে যে কেউ যদি একই বাক্সে থাকে তবে প্রশিক্ষণের পরিবর্তে লাইভ আপগ্রেড করতে পারে এবং আপনি কেবল আলাদা মার্জ মডিউলগুলির জন্য বৈশিষ্ট্যগুলি ব্যবহার করেন।
  • আপনি যদি নিজের এমএসআই ব্যবহার করে আপগ্রেডগুলি করার পাশাপাশি নতুন ইনস্টলগুলি যেমন মেজর আপগ্রেড কেবলমাত্র পদ্ধতির, এবং আপনি আপনার ইনস্টলেশন অবস্থানটি রেজিস্ট্রিতে সংরক্ষণ করেন তবে প্রতিটি ইনস্টলের জন্য কী নামের জন্য একটি ভেরিয়েবল তৈরি করতে ভুলবেন না।
  • আমরা প্রতিটি ইনস্টলারের জন্য অনন্য ভার্চুয়াল ডিরেক্টরি নাম, অ্যাপ্লিকেশন পুল, ডাটাবেস নাম, এবং cetera সক্ষম করতে প্রতিটি কনফিগারেশন.ওএক্সএইতে ভেরিয়েবল তৈরি করি।

আপডেট 1: স্বতঃ উত্পাদক উপাদান গাইডগুলি যদি ফাইলের কীপ্যাথ হিসাবে সেট করে প্রতিটি ফাইলের জন্য গাইড = "*" দিয়ে উপাদান তৈরি করা হয় তবে ফাইলআপডেট টাস্ক কল করার প্রয়োজনীয়তা সরিয়ে দেয়।

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

আপডেট 3: এসএনএন: এক্সটার্নাল এবং অস্থায়ী ফাইল তৈরির উপর নির্ভরতা অপসারণের একটি উপায় খুঁজে পেয়েছে। এটি বিল্ড প্রক্রিয়াটিকে আরও দৃili়তর করে তোলে (এবং যদি আপনি আপনার গাইডগুলিকে ওয়াইল্ডকার্ড করতে না পারেন তবে সেরা বিকল্প) এবং হালকা বা মোমবাতিতে বিল্ড ব্যর্থতা থাকলে কম ভঙ্গুর।

আপডেট 4: উদাহরণস্বরূপ রূপান্তরগুলি ব্যবহার করে একাধিক ইনস্ট্যান্সের জন্য সমর্থন ওয়াইএক্স 3.0++ এ রয়েছে, অবশ্যই দেখার জন্য এটি মূল্যবান।


এমএসবিল্ড কমিউনিটি টাস্ক রেফারেন্সের জন্য +1, সেই প্যাকেজটি পছন্দ
BozoJoe

17

এমএসআই ডায়াগনস্টিক লগিং ব্যবহার করে বিশদ ব্যর্থতার তথ্য পেতে

msiexec /i Package.msi /l*v c:\Package.log

কোথায়

Package.msi
আপনার প্যাকেজের নাম এবং
C: \ Package.log
আপনি লগ আউটপুট চান যেখানে

এমএসআই ত্রুটি কোডগুলি

উইক্স ইন্ট্রো ভিডিও
ওহ এবং র্যান্ডম উইক্স ইন্ট্রো ভিডিও "মিঃ ওয়াইএক্স" রব মেনচিং "ধারণামূলক বড় ছবি" সহায়ক।


2
+1 আমরা কমান্ড লাইনের পরিবর্তে উইক্সের মধ্যে থেকে লগিং সক্ষম করতে পারলে এটি আরও ভাল।
si618

3
ওয়াইএক্স করে। এমসিএলগিং সম্পত্তি সেট করুন। শুধুমাত্র উইন্ডোজ ইনস্টলার 4.0+ দ্বারা সমর্থিত।
রব মেনসিং

আপনাকে অনেক ধন্যবাদ "মিস্টার উইক্স"। দেখতে হবে।
টেরেন্স

17

জাভাস্ক্রিপ্ট কাস্টমঅ্যাকশনগুলি ব্যবহার করুন কারণ এগুলি খুব সহজ

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

একটি মাত্র ত্রুটি আছে: জাভাস্ক্রিপ্ট কাস্টমঅ্যাকশনগুলি অর্কের মাধ্যমে বের করা যেতে পারে, যেখানে একটি সি / সি ++ সিএ-এর বিপরীত প্রকৌশল প্রয়োজন require যদি আপনি আপনার ইনস্টলার যাদুটিকে বৌদ্ধিক সম্পত্তি সুরক্ষিত হিসাবে বিবেচনা করেন তবে আপনি স্ক্রিপ্ট এড়াতে চাইবেন।

আপনি যদি স্ক্রিপ্ট ব্যবহার করেন তবে আপনাকে কিছু কাঠামো দিয়ে শুরু করতে হবে। আপনাকে শুরু করার জন্য এখানে কিছু।


কাস্টমঅ্যাকশনটির জন্য জাভাস্ক্রিপ্ট "বয়লারপ্লেট" কোড:

//
// CustomActions.js 
// 
// Template for WIX Custom Actions written in Javascript.
// 
// 
// Mon, 23 Nov 2009  10:54
// 
// ===================================================================


// http://msdn.microsoft.com/en-us/library/sfw6660x(VS.85).aspx
var Buttons = {
        OkOnly           : 0,
        OkCancel         : 1,
        AbortRetryIgnore : 2,
        YesNoCancel      : 3
};

var Icons = {
        Critical         : 16,
        Question         : 32,
        Exclamation      : 48,
        Information      : 64
};

var MsgKind = {
        Error            : 0x01000000,
        Warning          : 0x02000000,
        User             : 0x03000000,
        Log              : 0x04000000
};

// http://msdn.microsoft.com/en-us/library/aa371254(VS.85).aspx
var MsiActionStatus = {
        None             : 0,
        Ok               : 1, // success
        Cancel           : 2,
        Abort            : 3,
        Retry            : 4, // aka suspend?
        Ignore           : 5  // skip remaining actions; this is not an error.
};


function MyCustomActionInJavascript_CA() {
    try {
        LogMessage("Hello from MyCustomActionInJavascript");
        // ...do work here...
        LogMessage("Goodbye from MyCustomActionInJavascript");
    }
    catch (exc1) {
        Session.Property("CA_EXCEPTION") = exc1.message ;
        LogException(exc1);
        return MsiActionStatus.Abort;
    }
    return MsiActionStatus.Ok;
}

// Pop a message box.  also spool a message into the MSI log, if it is enabled. 
function LogException(exc) {
    var record = Session.Installer.CreateRecord(0);
    record.StringData(0) = "CustomAction: Exception: 0x" + decimalToHexString(exc.number) + " : " + exc.message;
    Session.Message(MsgKind.Error + Icons.Critical + Buttons.btnOkOnly, record);
}


// spool an informational message into the MSI log, if it is enabled. 
function LogMessage(msg) {
    var record = Session.Installer.CreateRecord(0);
    record.StringData(0) = "CustomAction:: " + msg;
    Session.Message(MsgKind.Log, record);
}


// http://msdn.microsoft.com/en-us/library/d5fk67ky(VS.85).aspx
var WindowStyle = {
    Hidden : 0,
    Minimized : 1,
    Maximized : 2
};

// http://msdn.microsoft.com/en-us/library/314cz14s(v=VS.85).aspx
var OpenMode = {
    ForReading : 1,
    ForWriting : 2,
    ForAppending : 8
};

// http://msdn.microsoft.com/en-us/library/a72y2t1c(v=VS.85).aspx
var SpecialFolders = {
    WindowsFolder : 0, 
    SystemFolder :  1, 
    TemporaryFolder : 2
};

// Run a command via cmd.exe from within the MSI
function RunCmd(command)
{
    var wshell = new ActiveXObject("WScript.Shell");
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var tmpdir = fso.GetSpecialFolder(SpecialFolders.TemporaryFolder);
    var tmpFileName = fso.BuildPath(tmpdir, fso.GetTempName());

    LogMessage("shell.Run("+command+")");

    // use cmd.exe to redirect the output
    var rc = wshell.Run("%comspec% /c " + command + "> " + tmpFileName, WindowStyle.Hidden, true);
    LogMessage("shell.Run rc = "  + rc);

    // here, optionally parse the output of the command 
    if (parseOutput) {
        var textStream = fso.OpenTextFile(tmpFileName, OpenMode.ForReading);
        while (!textStream.AtEndOfStream) {
            var oneLine = textStream.ReadLine();
            var line = ParseOneLine(oneLine);
                ...
        }
        textStream.Close();
    }

    if (deleteOutput) {
        fso.DeleteFile(tmpFileName);
    }

    return {
        rc : rc,
        outputfile : (deleteOutput) ? null : tmpFileName
    };
}

তারপরে, কাস্টম অ্যাকশনটির এমন কিছু দিয়ে নিবন্ধ করুন:

<Fragment>
  <Binary Id="IisScript_CA" SourceFile="CustomActions.js" />

  <CustomAction Id="CA.MyCustomAction"
              BinaryKey="IisScript_CA"
              JScriptCall="MyCustomActionInJavascript_CA"
              Execute="immediate"
              Return="check" />
</Fragmemt>

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

আইআইএস 7-তে, আইআইএসের জন্য কোনও ডাব্লুএমআই সরবরাহকারী নেই, তাই আমি এটি ব্যবহার করেছি shell.Run() সম্পাদনের জন্য অ্যাপসিএমডি.এক্স.সি. সহজ।

সম্পর্কিত প্রশ্ন: জাভাস্ক্রিপ্ট কাস্টমঅ্যাকশন সম্পর্কে


2
+1 আমি ডিটিএফ পদ্ধতির সেটআপ করা সহজ বলে মনে করি, তবে জাভাস্ক্রিপ্টটিও কার্যকর হতে পারে।
si618

12

পিটার টেট ইতিমধ্যে দেখিয়েছেন যে কীভাবে আপনি পৃথক উইক্স টুকরোতে পুনরায় ব্যবহারযোগ্য কম্পোনেন্ট গ্রুপ সংজ্ঞা সংজ্ঞা দিতে পারেন। এটি সম্পর্কিত কিছু অতিরিক্ত কৌশল:

ডিরেক্টরি

উপাদান গ্রুপ টুকরা প্রধান পণ্য ডাব্লুএক্সএস দ্বারা সংজ্ঞায়িত ডিরেক্টরি সম্পর্কে জানতে হবে না। আপনার উপাদান গ্রুপ খণ্ডে আপনি এই জাতীয় ফোল্ডার সম্পর্কে কথা বলতে পারেন:

<DirectoryRef Id="component1InstallFolder">
...
</DirectoryRef>

তারপরে মূল পণ্যটি এর ডিরেক্টরিগুলির একটির (যেমন "প্রোডাক্টইনস্টলফোল্ডার") এর মতো করতে পারে:

<Directory Id="productInstallFolder" Name="ProductName">
   <!-- not subfolders (because no Name attribute) but aliases for parent! -->
   <Directory Id="component1InstallFolder"/> 
   <Directory Id="component2InstallFolder"/> 
</Directory>

নির্ভরতা গ্রাফ

কম্পোনেন্টগ্রুপ উপাদানগুলিতে কম্পোনেন্টগ্রুপ রেফ শিশু উপাদান থাকতে পারে। যদি আপনার মধ্যে একটি জটিল নির্ভরশীলতা গ্রাফ সহ পুনরায় ব্যবহারযোগ্য উপাদানগুলির একটি বড় পুল থাকে তবে এটি দুর্দান্ত। আপনি কেবলমাত্র প্রতিটি উপাদানগুলির জন্য নিজস্ব খণ্ডে একটি কম্পোনেন্টগ্রুপ সেট আপ করেছেন এবং এর মতো নির্ভরতা ঘোষণা করুন:

<ComponentGroup Id="B">
   <ComponentRef Id="_B" />
   <ComponentGroupRef Id="A">
</ComponentGroup>

আপনি যদি এখন আপনার সেটআপে উপাদান গোষ্ঠী "বি" উল্লেখ করেন কারণ এটি আপনার অ্যাপ্লিকেশনটির প্রত্যক্ষ নির্ভরতা, এটি স্বয়ংক্রিয়ভাবে উপাদান গোষ্ঠী "এ" এ টানবে এমনকি অ্যাপ্লিকেশন লেখক কখনই বুঝতে পারেন নি যে এটি "বি" এর নির্ভরতা। যতক্ষণ না আপনার কোনও সার্কুলার নির্ভরতা না থাকে এটি "কেবলমাত্র কাজ করে"।

পুনরায় ব্যবহারযোগ্য উইক্সলিব

উপরের নির্ভরতা গ্রাফ ধারণাটি সবচেয়ে ভাল কাজ করে যদি আপনি বিগ-পুল-ও-পুনরায় ব্যবহারযোগ্য-উপাদানগুলি lit.exe সহ পুনরায় ব্যবহারযোগ্য উইক্সলিবায় সংকলন করেন। অ্যাপ্লিকেশন সেটআপ তৈরি করার সময়, আপনি এই উইক্সলিবকে অনেকটা উইক্সোবজ ফাইলের মতো উল্লেখ করতে পারেন। মোমবাতি.এক্সই লিঙ্কার স্বয়ংক্রিয়ভাবে এমন কোনও টুকরো মুছে ফেলবে যা মূল পণ্য ডাব্লুএক্সএস ফাইল (গুলি) দ্বারা "টান" না।


12

আমি অবাক হয়েছি কেউই বিল্ড করার সময় ডাব্লুএক্সএস ফাইল উত্পন্ন করতে টি 4 ব্যবহার করার কথা উল্লেখ করেনি। আমি হেনরি লি @ নিউ এজ সলিউশনের মাধ্যমে এটি সম্পর্কে শিখেছি ।

মূলত, আপনি একটি টি 4 টেম্পলেট কার্যকর করতে একটি কাস্টম এমএসবিল্ড টাস্ক তৈরি করেন এবং উইক্স প্রকল্পটি সংকলনের ঠিক আগে টেমপ্লেট ডাব্লুএক্সএসকে আউটপুট দেয়। এটি আপনাকে অনুমতি দেয় (আপনি কীভাবে এটি প্রয়োগ করেন তার উপর নির্ভর করে) অন্য কোনও সমাধান সংকলন করে সমস্ত অ্যাসেমব্লিকে আউটপুট স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করে (যার অর্থ আপনি যখন কোনও নতুন সমাবেশ যুক্ত করবেন তখন আপনাকে ডাব্লুএক্সএস সম্পাদনা করতে হবে না)।


2
+1 এটি সত্যিই দুর্দান্ত, আমি সমাবেশগুলি সম্পর্কে এতটা চিন্তিত নই, তবে আমাদের ওয়েব প্রকল্পগুলিতে অ্যাপেক্স পৃষ্ঠাগুলি এবং অন্যান্য শিল্পকর্মগুলির (চিত্র, সিএসএস) সমস্যা থাকতে পারে যা প্রকল্পে যুক্ত হয় তবে ওয়াইএক্স নয়।
si618

4
ভবিষ্যতের দর্শনার্থীদের জন্য উইক্স ৩.৫ এর একটি ইউটিলিটি হিট.এক্সই রয়েছে যা এই
ফসলটি

@ মরিচিফ - আমি বিশ্বাস করি না যে স্থানীয় স্থানীয় অনুলিপি করা রেফারেন্স অ্যাসেমব্লিগুলি হিট করে - এটি স্পষ্টতই 4.0 এর জন্য পরিকল্পনা করা হয়েছে। রেফারেন্স: sourceforge.net/tracker/...
পিটার টি LaComb জুনিয়র

তাপ রেফারেন্স অ্যাসেম্বলসগুলি গ্রহণ করে না।
তোফুটিম

ডাব্লুএক্সএস ফাইল তৈরি করতে টি 4 ব্যবহার করার কয়েকটি ভাল উদাহরণ কী?
tofutim

12

Heat.exe ব্যবহার করে মুখটি ছিন্ন করতে এবং বেদনাদায়কভাবে বড় ইনস্টলগুলিতে "এপিক পাউনেজ" চাপিয়ে দেওয়া

সি সম্পর্কে এবং তাপ সম্পর্কে রবার্ট-পি এর উত্তরগুলি প্রসারিত করা হচ্ছে ।

অনুবাদ: (হাতের সাহায্যে প্রকল্পে স্বতন্ত্র ফাইলগুলি টাইপ করা এবং সামগ্রিক সহজ প্রক্রিয়াটির জন্য স্বয়ংক্রিয়ভাবে বিল্ডগুলি এড়াতে তাপ ব্যবহার করা))

ওয়াইএক্স ২.০ হিট সিনট্যাক্স বিস্তারিত

নতুন সংস্করণগুলির জন্য (পুরানো সংস্করণগুলির থেকে সমস্ত আলাদা নয় তবে সম্ভাব্য বিরক্তিকর সিনট্যাক্স পরিবর্তনগুলি রয়েছে ....) ডিরেক্টরিটি ডিরেক্টরিতে যান সেমিটি.ইক্সে থেকে তাপটি কেবল টাইপ করুন তবে সাহায্যের জন্য আমার এখানে একটি উদাহরণ রয়েছে প্রয়োজনে আরও নতুন সংস্করণ সহ।

ভিজ্যুয়াল স্টুডিও ২০১০-তে আপনার বিল্ড ইভেন্টে নিম্নলিখিতগুলি যুক্ত করা হচ্ছে
(

$(WIX)bin\heat.exe" dir "$(EnviromentVariable)" -cg GroupVariable -gg -scom -sreg -sfrag - srd -dr INSTALLLOCATION -var env.LogicPath -out "$(FragmentDir)\FileName.wxs

-gg 

তাপ চলাকালীন গাইডগুলি উত্পন্ন করে (আপনি উপরের কমান্ডটি কার্যকর করার সময় হিসাবে)

-scom 

"COM ফাইলগুলি" দখল করবেন না

-sreg 

"রেজিস্ট্রি ফাইলগুলি" দখল করবেন না

-sfrag 

"টুকরা" দখল করবেন না

-srd 

"রুট দির" দখল করবেন না

Dir

dir ইঙ্গিত দেয় যে আপনি তাপটি কোনও ফোল্ডারে দেখতে চান

"$ (EnviromentVariable)"

আপনি যে ভেরিয়েবলটির নাম প্রিপ্রোসেসর ভেরিয়েবলগুলিতে যুক্ত করবেন (ডান ক্লিক প্রকল্প, বৈশিষ্ট্যে যান) প্রকল্প বৈশিষ্ট্য-> বিল্ড বিভাগ যেখানে এটি প্রিপ্রসেসর ভেরিয়েবল সংজ্ঞায়িত করে (ভিজ্যুয়াল স্টুডিও 2010 ধরে)

উদাহরণ:
EnviromentVariable = সি: \ প্রকল্প \ বিন \ ডিবাগ;
কোনও ডাবল কোট নেই তবে সেমিকোলন দিয়ে শেষ হবে

-সিজি গ্রুপভেরিয়েবল 

কম্পোনেন্টগ্রুপ যা খণ্ড থেকে মূল ডাব্লুএক্সএস ফাইলে রেফারেন্স করা হবে

FragmentDir

খণ্ড ডিরেক্টরি যেখানে আউটপুট ডাব্লুএক্সএস টুকরোটি সংরক্ষণ করা হবে

FileName.wxs

ফাইলটির নাম

এখানে সম্পূর্ণ টিউটোরিয়াল, তাই freakin সহায়ক

পর্ব 1 অংশ 2


সামান্য ভিন্ন উদ্দেশ্যে আরও একটি ব্যবহারযোগ্য সরঞ্জাম রয়েছে: প্যারাফিন ( wintellect.com/CS/blogs/jrobbins/archive/2010/03/10/4107.aspx )
ralf.w.

9

COM অবজেক্টস সহ:

heatতাদের জন্য প্রয়োজনীয় সমস্ত রেজিস্ট্রি এন্ট্রি এবং অন্যান্য কনফিগারেশন সর্বাধিক (সমস্ত না থাকলে) উত্পন্ন করে। আনন্দ!

পরিচালিত COM অবজেক্টস (ওরফে,। নেট বা সি # COM অবজেক্টস) সহ

heatপরিচালিত COM অবজেক্টে ব্যবহার করা আপনাকে প্রায় সম্পূর্ণ উইক্স ডকুমেন্ট দেয়।

আপনার যদি জিএসি-তে উপলব্ধ লাইব্রেরিটির প্রয়োজন না হয় (যেমন, বিশ্বব্যাপী উপলভ্য: বেশিরভাগ সময় আপনার নিজের নেট নেট এসেম্বলিসমূহের সাথে প্রয়োজন হয় না - আপনি সম্ভবত এই সময়ে কিছু ভুল করেছেন যদি এটির উদ্দেশ্য না থাকে তবে একটি ভাগ লাইব্রেরি) আপনি CodeBaseসেট করতে হবে রেজিস্ট্রি কী আপডেট করতে নিশ্চিত করতে চাইবেন [#ComponentName]। আপনি যদি এটি জিএসি-তে ইনস্টল করার পরিকল্পনা করছেন (যেমন, আপনি কয়েকটি নতুন অসাধারণ সাধারণ গ্রন্থাগার তৈরি করেছেন যা প্রত্যেকে ব্যবহার করতে চাইবে) আপনাকে অবশ্যই এই এন্ট্রিটি সরিয়ে ফেলতে হবে এবং Fileউপাদানটিতে দুটি নতুন বৈশিষ্ট্য যুক্ত করতে হবে : Assemblyএবং KeyPath। সমাবেশকে ".NET" এ KeyPathসেট করা উচিত এবং "হ্যাঁ" এ সেট করা উচিত।

যাইহোক, কিছু পরিবেশ (বিশেষত পরিচালিত মেমরির মতো কিছু যেমন স্ক্রিপ্টিং ভাষাগুলির) পাশাপাশি টাইপলিবের অ্যাক্সেসের প্রয়োজন হবে। চালানো নিশ্চিত করুনheatআপনার টাইপলিব এবং এটি অন্তর্ভুক্ত । heatসমস্ত প্রয়োজনীয় রেজিস্ট্রি কী তৈরি করবে। কিভাবে শীতল হয়?


8

ইনস্টল করা হচ্ছে C:\ProductName

কিছু অ্যাপ্লিকেশনগুলিতে ইনস্টল করা C:\ProductNameবা অনুরূপ কিছু হওয়া দরকার , তবে নেট ইনস্টলটিতে 99.9% (যদি 100% নয়) উদাহরণC:\Program Files\CompanyName\ProductName

নিম্নলিখিত কোডটি TARGETDIRসম্পত্তিটি C:ড্রাইভের মূলটিতে সেট করতে ব্যবহার করা যেতে পারে ( ওয়াইএক্স-ব্যবহারকারীদের তালিকা থেকে নেওয়া ):

<CustomAction Id="AssignTargetDir" Property="TARGETDIR" Value="C:\" Execute="firstSequence" />
<InstallUISequence>
    <Custom Action="AssignTargetDir" Before="CostInitialize">TARGETDIR=""</Custom>
</InstallUISequence>
<InstallExecuteSequence>
    <Custom Action="AssignTargetDir" Before="CostInitialize">TARGETDIR=""</Custom>
</InstallExecuteSequence>

দ্রষ্টব্য: ডিফল্টরূপে, নির্দেশ TARGETDIR করে নাC:\ ! এটি পরিবর্তে সবচেয়ে বেশি ফাঁকা জায়গার সাথে ড্রাইভের মূলেরROOTDRIVE দিকে ইঙ্গিত করে ( এখানে দেখুন ) - এবং এটি সম্ভবত ড্রাইভ নয়। আর একটি হার্ড ড্রাইভ, পার্টিশন, বা ইউএসবি ড্রাইভ থাকতে পারে!C:

তারপরে, আপনার <Product ...>ট্যাগের নীচে কোথাও আপনার যথারীতি নিম্নলিখিত ডিরেক্টরি ট্যাগগুলির প্রয়োজন:

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="APPLICATIONFOLDER" Name="$(var.ProductName)">
        <!-- your content goes here... -->
    </Directory>
</Directory>

এটি কেবল ইনস্টল করা সহজ হবে না WindowsVolume?
উইম কোইন

1
হ্যাঁ, তবে আপনাকে একটি কার্যনির্বাহী ব্যবহার করতে হবে কারণ এখানে এবং এখানে নির্দেশিত হিসাবে WindowsVolumeসম্পত্তিটি Directory(সংকলক একটি ত্রুটি / সতর্কতা দেয়) হিসাবে ব্যবহৃত হতে পারে না । ব্যক্তিগতভাবে, আমি যে কাজটি বিভ্রান্তিকর মনে।
গেহহ

7

পরিবেশগত পরিবর্তনশীল

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

<define FILESOURCE = c:\source\output\bin\$(env.RELEASE_MODE) >

এবং তারপরে আপনার কোডে, উড়ে যাওয়ার জায়গায় এটি ব্যবহার করুন আপনার ডাব্লুএক্সএস ডকুমেন্টটি পরিবর্তন করুন, যেমন:

<Icon Id="myicon.ico" SourceFile="$(var.FILESOURCE)" />

1
সংকলন ভেরিয়েবল যেমন $ (কনফিগারেশন) এবং $ (প্ল্যাটফর্ম) উপলভ্য। এছাড়াও একটি গুচ্ছ এ আরো msdn.microsoft.com/en-us/library/aa302186.aspx
si618

1
@ এসআই - আজকের কিছু আগে এর আগে, সেই লিঙ্কটি আর সক্রিয় নেই। আমি সর্বশেষটি খুঁজে পেলাম না।
পিটার এম



7

সংলাপ সম্পাদনা

কথোপকথন সম্পাদনা করার জন্য একটি ভাল ক্ষমতা হ'ল 4.0.1.7090 (বা ততোধিক) সংস্করণে শার্প ডেভেলপ ব্যবহার করা। এই সরঞ্জামের সাহায্যে স্ট্যান্ডেলোন ডায়ালগ (যেমন WXX উত্স থেকে ডাব্লুএক্সএস ফাইলগুলি যেমন ইনস্টলডিরডলিগ.ডাব্লুএক্সএক্স) ডিজাইন দৃশ্যে খোলা, প্রাকদর্শন এবং সম্পাদনা করা যেতে পারে।


অসাধারণ, শার্পডেভলফ এটি সমর্থন করে জানত না।
anton.burger

6

আইআইএস enable32BitAppOnWin64 পতাকা নির্ধারণ http://trycatchfail.com/blog/post/WiX-Snippet-change-enable32BitAppOnWin64.aspx

<InstallExecuteSequence>
   <RemoveExistingProducts After="InstallFinalize" />
   <Custom Action="ConfigureAppPool" After="InstallFinalize" >
     <![CDATA[NOT Installed AND VersionNT64 >= 600]]>         
   </Custom>
</InstallExecuteSequence>

<CustomAction Id="ConfigureAppPool" Return="check" Directory="TARGETDIR" ExeCommand="[SystemFolder]inetsrv\appcmd set apppool /apppool.name:[APPPOOLNAME] /enable32BitAppOnWin64:false" />

5

"ইনস্টল করার জন্য প্রস্তুত?" সংলাপ (ওরফে VerifyReadyDlg) করা পছন্দগুলির সংক্ষিপ্তসার সরবরাহ করতে।

এটি এর মতো দেখাচ্ছে:
Alt পাঠ্য http://i46.tinypic.com/s4th7t.jpg

একটি জাভাস্ক্রিপ্ট কাস্টমঅ্যাকশন দিয়ে এটি করুন:


জাভাস্ক্রিপ্ট কোড:

// http://msdn.microsoft.com/en-us/library/aa372516(VS.85).aspx
var MsiViewModify = 
    {
        Refresh          : 0,
        Insert           : 1,
        Update           : 2,
        Assign           : 3,
        Replace          : 4,
        Merge            : 5,
        Delete           : 6,
        InsertTemporary  : 7,   // cannot permanently modify the MSI during install
        Validate         : 8,
        ValidateNew      : 9,
        ValidateField    : 10,
        ValidateDelete   : 11
    };


// http://msdn.microsoft.com/en-us/library/sfw6660x(VS.85).aspx
var Buttons = 
    {
        OkOnly           : 0,
        OkCancel         : 1,
        AbortRetryIgnore : 2,
        YesNoCancel      : 3
    };

var Icons= 
    {
        Critical         : 16,
        Question         : 32,
        Exclamation      : 48,
        Information      : 64
    }

var MsgKind =
    {
        Error            : 0x01000000,
        Warning          : 0x02000000,
        User             : 0x03000000,
        Log              : 0x04000000
    };

// http://msdn.microsoft.com/en-us/library/aa371254(VS.85).aspx
var MsiActionStatus = 
    {
        None             : 0,
        Ok               : 1, // success
        Cancel           : 2,
        Abort            : 3,
        Retry            : 4, // aka suspend?
        Ignore           : 5  // skip remaining actions; this is not an error.
    };

function UpdateReadyDialog_CA(sitename)
{
    try 
    {
        // can retrieve properties from the install session like this:
        var selectedWebSiteId = Session.Property("MSI_PROPERTY_HERE");

        // can retrieve requested feature install state like this:
        var fInstallRequested   = Session.FeatureRequestState("F.FeatureName");

        var text1 = "This is line 1 of text in the VerifyReadyDlg";

        var text2 = "This is the second line of custom text";

        var controlView     = Session.Database.OpenView("SELECT * FROM Control");
        controlView.Execute();

        var rec             = Session.Installer.CreateRecord(12);
        rec.StringData(1)   = "VerifyReadyDlg";    // Dialog_
        rec.StringData(2)   = "CustomVerifyText1"; // Control - can be any name
        rec.StringData(3)   = "Text";              // Type
        rec.IntegerData(4)  = 25;                  // X
        rec.IntegerData(5)  = 60;                  // Y
        rec.IntegerData(6)  = 320;                 // Width
        rec.IntegerData(7)  = 85;                  // Height
        rec.IntegerData(8)  = 2;                   // Attributes
        rec.StringData(9)   = "";                  // Property
        rec.StringData(10)  = vText1;              // Text
        rec.StringData(11)  = "";                  // Control_Next
        rec.StringData(12)  = "";                  // Help
        controlView.Modify(MsiViewModify.InsertTemporary, rec);

        rec                 = Session.Installer.CreateRecord(12);
        rec.StringData(1)   = "VerifyReadyDlg";    // Dialog_
        rec.StringData(2)   = "CustomVerifyText2"; // Control - any unique name
        rec.StringData(3)   = "Text";              // Type
        rec.IntegerData(4)  = 25;                  // X
        rec.IntegerData(5)  = 160;                 // Y
        rec.IntegerData(6)  = 320;                 // Width
        rec.IntegerData(7)  = 65;                  // Height
        rec.IntegerData(8)  = 2;                   // Attributes
        rec.StringData(9)   = "";                  // Property
        rec.StringData(10)  = text2;               // Text
        rec.StringData(11)  = "";                  // Control_Next
        rec.StringData(12)  = "";                  // Help
        controlView.Modify(MsiViewModify.InsertTemporary, rec);

        controlView.Close();
    }
    catch (exc1)
    {
        Session.Property("CA_EXCEPTION") = exc1.message ;
        LogException("UpdatePropsWithSelectedWebSite", exc1);
        return MsiActionStatus.Abort;
    }
    return MsiActionStatus.Ok;
}


function LogException(loc, exc)
{
    var record = Session.Installer.CreateRecord(0);
    record.StringData(0) = "Exception {" + loc + "}: " + exc.number + " : " + exc.message;
    Session.Message(MsgKind.Error + Icons.Critical + Buttons.btnOkOnly, record);
}

জাভাস্ক্রিপ্ট সিএ ঘোষণা করুন:

<Fragment>
  <Binary Id="IisScript_CA" SourceFile="CustomActions.js" />

  <CustomAction Id="CA.UpdateReadyDialog"
              BinaryKey="IisScript_CA"
              JScriptCall="UpdateReadyDialog_CA"
              Execute="immediate"
              Return="check" />
</Fragment>

একটি বোতামে সিএ সংযুক্ত করুন। এই উদাহরণে, কাস্টমাইজডএলজি থেকে পরবর্তী ক্লিক করা হলে সিএ বহিস্কার করা হয়:

<UI ...>
  <Publish Dialog="CustomizeDlg" Control="Next" Event="DoAction" 
           Value="CA.UpdateReadyDialog" Order="1"/>
</UI>

সম্পর্কিত এসও প্রশ্ন: রানটাইমের সময় আমি কীভাবে পাঠ্যটি VerifyReadyDlg এ প্রদর্শিত হবে সেট করতে পারি?


অবশ্যই এটি জাভাস্ক্রিপ্ট ডিএইচটিএমএল স্ক্রিপ্টিং ল্যাঙ্গুয়েজের চেয়ে উইন্ডোজ স্ক্রিপ্টিং ভাষা নয় S সম্ভবত কিছুটা পেডেন্টিক তবে কিছু লোকের কাছে এটি কিছুটা বিভ্রান্তিকর হতে পারে।
ক্যাভম্যান_ডিক

5

উপাদানগুলি রাখুন যা তাদের নিজস্ব খণ্ডগুলির মধ্যে পৃথকভাবে প্যাচ করা যেতে পারে

এটি পণ্য ইনস্টলার এবং প্যাচ উভয়ই তৈরি করে যে আপনি যদি কোনও খণ্ডে কোনও উপাদান অন্তর্ভুক্ত করেন তবে আপনাকে অবশ্যই সেই খণ্ডের সমস্ত উপাদান অন্তর্ভুক্ত করতে হবে । ইনস্টলার তৈরির ক্ষেত্রে, আপনি যদি কোনও উপাদানগুলির রেফারেন্স মিস করেন তবে আপনি light.exe থেকে একটি লিঙ্কিং ত্রুটি পাবেন। যাইহোক, আপনি যখন কোনও প্যাচ তৈরি করেন, আপনি যদি কোনও খণ্ডে কোনও একক উপাদান রেফারেন্স অন্তর্ভুক্ত করেন, তবে সমস্ত সেই খণ্ডের পরিবর্তিত উপাদানগুলি আপনার প্যাচে প্রদর্শিত হবে।

এটার মত:

<Fragment>
    <DirectoryRef Id="SampleProductFolder">
        <Component Id="SampleComponent1" Guid="{C28843DA-EF08-41CC-BA75-D2B99D8A1983}" DiskId="1">
            <File Id="SampleFile1" Source=".\$(var.Version)f\Sample1.txt" />
        </Component>
    </DirectoryRef>
</Fragment>

<Fragment>
    <DirectoryRef Id="SampleProductFolder">
        <Component Id="SampleComponent2" Guid="{6CEA5599-E7B0-4D65-93AA-0F2F64402B22}" DiskId="1">
           <File Id="SampleFile2" Source=".\$(var.Version)f\Sample2.txt" />
        </Component>
    </DirectoryRef>
</Fragment>

<Fragment>
    <DirectoryRef Id="SampleProductFolder">
        <Component Id="SampleComponent3" Guid="{4030BAC9-FAB3-426B-8D1E-DC1E2F72C2FC}" DiskId="1">
           <File Id="SampleFile3" Source=".\$(var.Version)f\Sample3.txt" />
        </Component>
    </DirectoryRef>
</Fragment>

এর পরিবর্তে:

<Fragment>
    <DirectoryRef Id="SampleProductFolder">
        <Component Id="SampleComponent1" Guid="{C28843DA-EF08-41CC-BA75-D2B99D8A1983}" DiskId="1">
            <File Id="SampleFile1" Source=".\$(var.Version)\Sample1.txt" />
        </Component>

        <Component Id="SampleComponent2" Guid="{6CEA5599-E7B0-4D65-93AA-0F2F64402B22}" DiskId="1">
           <File Id="SampleFile2" Source=".\$(var.Version)\Sample2.txt" />
        </Component>

        <Component Id="SampleComponent3" Guid="{4030BAC9-FAB3-426B-8D1E-DC1E2F72C2FC}" DiskId="1">
           <File Id="SampleFile3" Source=".\$(var.Version)\Sample3.txt" />
        </Component>
    </DirectoryRef>
</Fragment>

এছাড়াও, প্যাচ উত্পন্ন করার জন্য এই পদ্ধতিটি ব্যবহার করে, ওয়াইএক্স.এমএইচএম সহায়তা ফাইল থেকে "পিউরিলি ওয়াইএক্স ব্যবহার করুন" বিষয়টি ব্যবহার করে প্যাচিংয়ের সময়:

torch.exe -p -xi 1.0\product.wixpdb 1.1\product.wixpdb -out patch\diff.wixmst
candle.exe patch.wxs
light.exe patch.wixobj -out patch\patch.wixmsp
pyro.exe patch\patch.wixmsp -out patch\patch.msp -t RTM patch\diff.wixmst

পৃথক টুকরোতে উপাদান ব্যবহার করে কেবল product.wixpdb এর 1.1 সংস্করণ তৈরি করা যথেষ্ট নয়। সুতরাং শিপিংয়ের আগে সঠিকভাবে আপনার পণ্যটি খণ্ডিত করতে ভুলবেন না।


5

উইক্স ৩.০ এবং তার পরে EULA মুদ্রণ করা হচ্ছে

1) আপনি যখন আপনার উইক্স উত্স কোডটি সংকলন করেন, লাইট.এক্সই অবশ্যই কমান্ড লাইনে WixUIExtension.dll উল্লেখ করতে হবে। এর জন্য কমান্ড লাইন স্যুইচ -েক্সট ব্যবহার করুন।

2) আপনি যখন WixUIExtension.dll এ রেফারেন্স যুক্ত করেন, আপনার প্রকল্পটি সংকলন করতে ব্যর্থ হয়, এটি সম্ভবত ডায়ালগ আইডিগুলির সংঘর্ষের কারণে ঘটতে পারে, অর্থাৎ আপনার প্রকল্পটি ডায়লগের একই আইডিগুলি উইক্সুআইএক্সটেনশন.ডিলের কিছু স্ট্যান্ডার্ড ডায়ালগ হিসাবে ব্যবহার করছিল, আপনার কথোপকথনে বিভিন্ন আইডি দিন। এটি বেশ সাধারণ সমস্যা।

3) আপনার লাইসেন্স ডায়ালগটিতে অবশ্যই "লাইসেন্সটেক্সট" আইডি সহ স্ক্রোল টেক্সট নিয়ন্ত্রণ থাকতে হবে। উইকস যখন প্রিন্ট করে তখন ঠিক এই নিয়ন্ত্রণের নামটি অনুসন্ধান করে।

<Control Id="LicenseText" Type="ScrollableText" X="20" Y="60" Width="330" Height="160" Sunken="yes" TabSkip="no">
    <Text SourceFile="License.rtf" />
</Control>

এবং একটি পুশবটন যা কাস্টম ক্রিয়াকে বোঝায়

<Control Type="PushButton" Id="PrintButton" Width="57" Height="17" X="19" Y="244" Text="Print">
    <Publish Event="DoAction" Value="PrintEula">1</Publish>
</Control>

4) আইডি = "প্রিন্টইউলা" এর সাথে কাস্টমএ্যাকশন সংজ্ঞায়িত করুন:

<CustomAction Id="PrintEula" BinaryKey="WixUIWixca" DllEntry="PrintEula" Return="ignore" Execute="immediate" />

দ্রষ্টব্য: বাইনারিকি উইক্স ২.০ এর সাথে তুলনা করা উইক্স ৩.০-এ আলাদা এবং অবশ্যই "উইক্সুআইউইউইক্সকা" (কেস সংবেদনশীল) হতে হবে।

যখন ব্যবহারকারী বোতামটি টিপেন তখন সে স্ট্যান্ডার্ড সিলেক্ট প্রিন্টার ডায়ালগ উপস্থাপন করবে এবং সেখান থেকে মুদ্রণ করতে সক্ষম হবে।


5
  • আমরা জিইউআইর প্রথম স্ক্রিনে কোথাও পণ্যটির সংস্করণ (ক্ষুদ্র) প্রদর্শন করি। কারণ লোকেরা প্রতিবার সঠিক সংস্করণটি বেছে নেওয়ার ক্ষেত্রে ভুল করতে থাকে। (এবং আমাদের বিকাশকারীদের যুগের জন্য অনুসন্ধানে রাখুন ..)

  • আমরা আমাদের বিভিন্ন পরিবেশের জন্য কনফিগারেশন সহ ট্রান্সফর্ম (.mst ফাইল) উত্পন্ন করতে টিএফএসবিল্ড সেট আপ করেছি। (আমাদের যে সমস্ত পরিবেশে মোতায়েন করা দরকার সেগুলি সম্পর্কে আমরা জানি)।

গ্রান্ট হোলিদিয়ার মূল ওয়েবলগ পোস্টটি নিচে থাকায় আমি এখানে এর লিখিত বিষয়বস্তুগুলি অনুলিপি করেছি:


এক্সএমমার্ক 11 2008 থেকে এমএসআই ট্রান্সফর্ম ফাইলগুলি তৈরি করা এমএসবিল্ড টাস্ক

আমার আগের পোস্টে আমি বর্ণনা করেছি যে কীভাবে আপনি জেনেরিক এমএসআই প্যাকেজ থেকে পরিবেশ-নির্দিষ্ট কনফিগারেশন সেটিংস আলাদা করতে এমএসআই ট্রান্সফর্ম (* .এমএসটি) ফাইল ব্যবহার করতে পারেন।

যদিও এটি আপনার কনফিগারেশনে একটি স্তরকে নমনীয়তা সরবরাহ করে, ট্রান্সফর্ম ফাইলগুলির দুটি নীচের দিক রয়েছে:

  1. এগুলি একটি বাইনারি বিন্যাস
  2. আপনি কোনও রূপান্তর ফাইল "সম্পাদনা" বা "দেখুন" করতে পারবেন না। এতে কী কী পরিবর্তন রয়েছে তার জন্য আপনাকে এটি প্রয়োগ করতে হবে বা এটি পুনরায় তৈরি করতে হবে।

ভাগ্যক্রমে আমরা এমএসআই "ডাটাবেসগুলি" খুলতে এবং রূপান্তর ফাইল তৈরি করতে মাইক্রোসফ্ট উইন্ডোজ ইনস্টলার অবজেক্ট লাইব্রেরি (সি: উইন্ডোসিসটেম 32msi.dll) ব্যবহার করতে পারি।

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

উত্স কোড এবং উদাহরণ ট্রান্সফর্ম.এক্সএমএল ডাউনলোড করুন (K 7 কেবি জিপড ভিএস 2008 সমাধান)



2
আমরা আমার স্থানীয়করণের ফাইলে ওয়েলকড্লিজিটিটলটিকে নতুনভাবে সংজ্ঞায়িত করি - দুর্দান্ত কাজ করে! <স্ট্রিং আইডি = "ওয়েলকামডলজিটাইটেল"> ix ix উইক্সইউআই_ফন্ট_বিগার [[প্রোডাক্টনাম] [প্রোডাক্ট ভার্সন] সেটআপ উইজার্ড </ স্ট্রিং>
স্টাচবিউয়ামন্টে 20:32

5

একটি ইনস্টল প্যাকেজ মোতায়েন করার আগে আমি সর্বদা এর বিষয়বস্তু নিয়ন্ত্রণ করি।

কমান্ড লাইনে এটি কেবল একটি সহজ কল (টেরেন্সেস পোস্ট অনুসারে) ওপেন কমান্ড লাইনে প্রবেশ করুন

msiexec /a Package.msi /qb TARGETDIR="%CD%\Extract" /l*vx "%CD\install.log%"

এটি বর্তমান পথ সহ একটি সাবডির 'এক্সট্র্যাক্ট' - এ প্যাকেজ সামগ্রীগুলি বের করবে।


4

ওআরসিএর পরিবর্তে ইনস্টিএড ব্যবহার করুন যা এমএসআই টেবিলগুলি দেখার জন্য একটি ভাল সরঞ্জাম। এছাড়াও এটিতে ট্রান্সফর্ম -> এর সাথে তুলনা করে দুটি প্যাকেজকে আলাদা করার ক্ষমতা রয়েছে ...

অতিরিক্ত অতিরিক্ত কার্যকারিতা সহ একটি প্লাস সংস্করণ উপলব্ধ। তবে ফ্রি সংস্করণটিও অর্কের জন্য একটি ভাল বিকল্প প্রস্তাব করে।


4

X86 / x64 সামঞ্জস্য সহ COM ইন্টারপের জন্য .NET সমাবেশগুলি নিবন্ধভুক্ত করা হচ্ছে

এনবি এই টুকরাটি মূলত REGASM সমাবেশ.dll / কোডবেসের সমান

এই নমুনাটিতে বেশ কয়েকটি জিনিস চলছে তাই এখানে কোড দেওয়া আছে এবং আমি এটি পরে ব্যাখ্যা করব ...

  <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?include $(sys.CURRENTDIR)\Config.wxi?>
  <?if $(var.Win64) ?>
  <?define CLSIDRoots = "CLSID;Wow6432Node\CLSID"?>
  <?else ?>
  <?define CLSIDRoots = "CLSID"?>
  <?endif?>
  <!-- ASCOM Driver Assembly with related COM registrations -->
  <Fragment>
    <DirectoryRef Id="INSTALLLOCATION" />
  </Fragment>
  <Fragment>
    <ComponentGroup Id="cgAscomDriver">
      <Component Id="cmpAscomDriver" Directory="INSTALLLOCATION" Guid="{0267031F-991D-4D88-A748-00EC6604171E}">
        <File Id="filDriverAssembly" Source="$(var.TiGra.Astronomy.AWRDriveSystem.TargetPath)" KeyPath="yes" Vital="yes" Assembly=".net" AssemblyApplication="filDriverAssembly"  />
        <RegistryKey Root="HKCR" Key="$(var.DriverId)"  Action="createAndRemoveOnUninstall">
          <RegistryValue Type="string" Value="$(var.DriverTypeName)"/>
          <RegistryKey Key="CLSID">
            <RegistryValue Type="string" Value="$(var.DriverGuid)" />
          </RegistryKey>
        </RegistryKey>
        <?foreach CLSID in $(var.CLSIDRoots) ?>
        <RegistryKey Root="HKCR" Key="$(var.CLSID)" Action="none">
          <RegistryKey Key="$(var.DriverGuid)" Action="createAndRemoveOnUninstall">
            <RegistryValue Type="string" Value="$(var.DriverTypeName)"/>
            <RegistryKey Key="InprocServer32">
              <RegistryValue Type="string" Value="mscoree.dll" />
              <RegistryValue Type="string" Name="ThreadingModel" Value="Both"/>
              <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/>
              <RegistryValue Type="string" Name="Assembly" Value="!(bind.assemblyFullname.filDriverAssembly)" />
              <RegistryValue Type="string" Name="RuntimeVersion" Value="v2.0.50727"/>
              <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" />
              <RegistryKey Key="!(bind.fileVersion.filDriverAssembly)" >
                <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/>
                <RegistryValue Type="string" Name="Assembly" Value="!(bind.assemblyFullname.filDriverAssembly)" />
                <RegistryValue Type="string" Name="RuntimeVersion" Value="v2.0.50727"/>
                <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" />
              </RegistryKey>
            </RegistryKey>
            <RegistryKey Key="ProgId" Action="createAndRemoveOnUninstall">
              <RegistryValue Type="string" Value="$(var.DriverId)" />
            </RegistryKey>
            <RegistryKey Key="Implemented Categories" Action="createAndRemoveOnUninstall" >
              <RegistryKey Key="{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Action="createAndRemoveOnUninstall" />
            </RegistryKey>
          </RegistryKey>
        </RegistryKey>
        <?endforeach?>
      </Component>
    </ComponentGroup>
  </Fragment>
</Wix>

যদি আপনি ভাবছিলেন, এটি আসলে একজন এসকোম টেলিস্কোপ ড্রাইভারের জন্য

প্রথমত, আমি উপরে থেকে পরামর্শ নিয়েছি এবং পৃথক ফাইলে কিছু প্ল্যাটফর্ম ভেরিয়েবল তৈরি করেছি, আপনি এটি এক্সএমএলের মাধ্যমে ছড়িয়ে থাকা দেখতে পাচ্ছেন।

শীর্ষস্থানটির নিকটে যদি অন্যথায় অংশটি x86 বনাম x64 সামঞ্জস্যের সাথে ডিল করে। আমার এসেম্বলিটি 'যেকোনো সিপিইউ' লক্ষ্য করে তাই এক্স x 64 সিস্টেমে, আমাকে এটি একবার দু'বার নিবন্ধিত করতে হবে, একবার 64৪-বিট রেজিস্ট্রি এবং একবার 32-বিট Wow6432Nodeঅঞ্চলে register যদি-তবে-অন্য আমাকে এর জন্য সেট আপ করে, মানগুলি একটিতে ব্যবহৃত হয়foreach পরে লুপে হয়। এইভাবে, আমাকে কেবল একবার রেজিস্ট্রি কীগুলি লেখতে হবে (DRY নীতি)।

ফাইল উপাদানটি আসল সমাবেশ dll ইনস্টল এবং নিবন্ধিত হচ্ছে তা নির্দিষ্ট করে:

<File Id="filDriverAssembly" Source="$(var.TiGra.Astronomy.AWRDriveSystem.TargetPath)" KeyPath="yes" Vital="yes" Assembly=".net" AssemblyApplication="filDriverAssembly"  />

কিছুই বিপ্লবী নয়, তবে লক্ষ্য করুন Assembly=".net"- এই বৈশিষ্ট্যটিই কেবল সমাবেশকে জিএসি-তে রাখার কারণ হতে পারে, যা আমি চাইতাম না। AssemblyApplicationনিজের দিকে ফিরে নির্দেশ করার জন্য এ্যাট্রিবিউটটি ব্যবহার করা সহজভাবে উইক্সকে জিএসি-তে ফাইলটি থামিয়ে দেওয়ার এক উপায়। এখন যে উইক্স জানে এটি একটি নেট নেট অ্যাসেমব্লি, যদিও এটি আমাকে আমার এক্সএমএল এর মধ্যে নির্দিষ্ট বাইন্ডার ভেরিয়েবলগুলি ব্যবহার করতে দেয় যেমন !(bind.assemblyFullname.filDriverAssembly)সমাবেশের পুরো নামটি পেতে।


3

DISABLEADVTSHORTCUTSআপনার ইনস্টলারের সমস্ত বিজ্ঞাপনযুক্ত শর্টকাটগুলিকে নিয়মিত শর্টকাট হওয়ার জন্য বাধ্য করার জন্য সম্পত্তি সেট করুন এবং কীপথ হিসাবে আপনাকে ডামি রেজ কী ব্যবহার করার দরকার নেই।

<Property Id="DISABLEADVTSHORTCUTS" Value="1"/>

আমি মনে করি উইন্ডোজ ইনস্টলার 4.0.০ বা তার চেয়ে বেশি এর একটি প্রয়োজনীয়তা


2

এটি একটি দুর্দান্ত কাঠামো তবে আমার অভিজ্ঞতার ভিত্তিতে আমি অবাক হয়েছি আপনি কীভাবে এই শর্তগুলি সমাধান করেন:

উ: আপনার ইনস্টলগুলি একই গন্তব্যে অবতরণ করছে। যদি কোনও ব্যবহারকারীকে 3 টি সংস্করণ একবারে ইনস্টল করতে হয় তবে আপনার প্রক্রিয়াটি এটিকে অনুমতি দেবে। তারা কি নির্বিঘ্নে বলতে পারে যে তারা কার্যকর করা প্রতিটি এক্সিকিউটেবলের কোন সংস্করণ চালু করছে?

খ। আপনি কীভাবে টেস্ট এবং / অথবা প্রশিক্ষণের মধ্যে থাকা কিন্তু এখনও লাইভে নেই এমন নতুন ফাইলগুলি পরিচালনা করবেন?


হাই ব্লেইন, এ। না তারা দেয় না। ইনস্টলনাম কনফিগ.ওএক্সসি-তে রয়েছে যা একমাত্র ফাইল যা এসএনএন: এক্সটার্নাল দ্বারা রেফারেন্স করা হয় না। সুতরাং এটি প্রতিটি ইনস্টল, অর্থাত্ প্রতিটি পণ্যের জন্য অনন্য। এজন্যই আমরা প্রতিটি সংস্করণের জন্য গাইডগুলি সংশোধন করি। বি.গোটো এ :) তাদের নিজস্ব আপগ্রেডকোডের সাথে পৃথক এমএসআই।
si618

1
যাইহোক, আপনি কেন আমার প্রশ্নের উত্তর দিয়েছিলেন তা আমি বুঝতে পেরেছি, তবে একবার যথেষ্ট পরিমাণে প্রতিশ্রুতি পেলাম, দয়া করে আপনার প্রশ্নের উত্তর মন্তব্যে সরিয়ে দিন, অন্যথায় থ্রেডটি অনুসরণ করা শক্ত হবে।
si618

2

এখানেবৃহত্তর ওয়েব প্রকল্পগুলিকে এমএসআই (বা মার্জ মডিউল) এ অন্তর্নির্মিত ফাইলের সংখ্যার সাথে মিলে যাওয়া ফাইলগুলির সংখ্যা মেলে তা যাচাই করার জন্য একটি উপায়। আমি কেবলমাত্র আমাদের মূল অ্যাপ্লিকেশনটির বিরুদ্ধে কাস্টম এমএসবিল্ড টাস্কটি চালিয়েছি (এখনও বিকাশে রয়েছে) এবং এটি বেশ কয়েকটি হারিয়ে যাওয়া ফাইল, বেশিরভাগ চিত্র তুলে নিয়েছে, তবে কয়েকটি জাভাস্ক্রিপ্ট ফাইল এতে পিছলে গেছে!

এই পদ্ধতির (ওয়াইএক্স প্রকল্পের আফটার বিল্ড টার্গেটে এমএসআই-এর ফাইল সারণিতে উঁকি দেওয়া) অন্যান্য অ্যাপ্লিকেশন ধরণের ক্ষেত্রে কাজ করতে পারে যেখানে আপনার প্রত্যাশিত ফাইলগুলির একটি সম্পূর্ণ তালিকার অ্যাক্সেস রয়েছে।


2

যখন কোনও ইনস্টল আনইনস্টল বা পুনরায় ইনস্টল করার অনুমতি দেয় না এবং পুনরায় রোল দেয় না তখন জোর করে পুনরায় ইনস্টল করা Per

ভিবিস্ক্রিপ্ট স্ক্রিপ্ট কোনও ইনস্টলকে ওভাররাইড করার জন্য ব্যবহৃত যা কোনও কারণেই আনইনস্টল করছে না ..

Dim objShell
set objShell = wscript.createObject("wscript.shell")

iReturn = objShell.Run("CMD /K MsiExec.exe /I ""C:\Users\TheUser\Documents\Visual Studio 2010\Projects\InstallationTarget\HelloInstaller\bin\Debug\HelloInstaller.msi"" REINSTALLMODE=vomus REINSTALL=ALL",,True)

2

এমন একটি ইউআই তৈরি করুন যাতে কাস্টম অ্যাকশন রয়েছে যা একটি ভেরিয়েবল সেট করবে এবং ইউআই কাস্টম অ্যাকশনে ভেরিয়েবল সেটের উপর ভিত্তি করে পরবর্তী বোতামটি (বা অনুরূপ) অক্ষম / সক্ষম করবে।

আপনি যেমন ভাবেন ঠিক ততটা সোজা-ফরোয়ার্ড নয়, কোথাও ডকুমেন্টেড নয় খুব বেশি কঠিনও নয়!

শর্তাদি, বৈশিষ্ট্য এবং কাস্টম অ্যাকশনগুলির সাথে উইক্স ইন্টারঅ্যাকশন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.