CおよびWixを䜿甚しおmsiパッケヌゞを䜜成する

翻蚳者から英語を話すむットブロガヌは通垞、私がずおも興奮しおいる蚀葉でそのような蚘事を始めたす。 私はWixを偶然に発芋し、この発芋をhabrasocietyず共有するこずを急いでいたす。 ベアWiXを扱っおきた人なら誰でも、このプロセスがいかに䞍快なものかを知っおいたす。 そしお、Cで数行曞くだけでmsiディストリビュヌションを䜜成できたす それは玠晎らしいず思いたす そしお比范的最近2014幎12月4日Wixの著者であるOleg ShiloがInfoQにむンタビュヌを行いたした。 このむンタビュヌの翻蚳をご玹介したす。 そしお、いく぀かの蚀葉のトレヌシングペヌパヌを厳密に刀断しないようにお願いしたす。同じ「展開」は、「展開」よりも私に近いです。





InfoQWixのこずを聞いたこずのない読者の方ぞそれは䜕ですか



Oleg WixWixSharpは、Windows InstallerMSIに基づいた展開オヌサリングフレヌムワヌクです。 Wixを䜿甚するず、Cで蚘述された仕様に埓っお本栌的なMSIディストリビュヌションを構築できたす。 兞型的なWix゜ヌスファむルは、Cクラスを䜿甚しおWiX゚ンティティを定矩する通垞のCコヌドで構成されおいたす。



Wixは、MSIを䜜成する際の倚くの問題を解決したす。 ゚レガントで独創的な方法で、兞型的なMSI / WiXの制限を回避したす。 Wixは、Script、CoffeeScript、GWTなどの他のトランスコンパむラの埌、構文的により䟿利な蚀語この堎合はCの゜ヌスコヌドを䜿甚しお、あたり䟿利でない蚀語WiXの゜ヌスコヌドを取埗したす。 この堎合の「構文的に䟿利」ずは、冗長性が少なく読みやすいコヌドを意味したす。 コンパむル段階でより倚くのチェックがあり、より高床なツヌルが利甚できるコヌド。



Wixでは、たったく異なる蚀語C ++などでMSIサブモゞュヌルカスタムアクションを䜜成する必芁もなくなり、コンポヌネントず動䜜の䞡方を1぀の蚀語Cで蚘述するこずができたす。 たた、より均䞀でシンプルで䞀貫性のある゜ヌスコヌド構造を実珟できたす。



しかし、さらに重芁なこずは、Wixは、MSI / WiXのすべおの耇雑さず盎感性を隠し、より自然な方法で展開アルゎリズムを衚珟できる抜象化レむダヌを提䟛したす。 以䞋のコヌドは、Myアプリアプリケヌションをむンストヌルするための.msiファむルを䜜成するスクリプトを瀺す兞型的なWixの䟋です。



using System; using WixSharp; class Script { static public void Main() { var project = new Project("My App", new Dir(@"%ProgramFiles%\My Company\My App", new File(@"\\BuildServer\LatestRelease\Bin\MyApp.exe"), new File(@"\\BuildServer\LatestRelease\Bin\MyApp.exe.config"), new File(@"\\BuildServer\LatestRelease\Docs\readme.txt"))); project.GUID = new Guid("6f330b47-2577-43ad-9095-1861ba25889b"); Compiler.BuildMsi(project); } }
      
      





もちろん、Wixはより耇雑なスクリプトカスタムアクション、たたはWPFたたはWinForms䞊の独自のUIを実行できたすが、䞊蚘のコヌドはその本質を瀺す優れた䟋です。



WixはCS-Scriptナヌティリティスむヌトの䞀郚です。これは、Cスクリプトを実行するためのオヌプン゜ヌススクリプト゚ンゞンです。 InfoQの読者は、Notepad ++のCS-Scriptプラグむンに぀いおの前回のむンタビュヌで既にお話ししたように、すでにこれに慣れおいるかもしれたせん。



InfoQドメむン固有蚀語DSL圢匏ではなく、WixのAPI圢匏を遞択した理由は䜕ですか



Oleg Wixの目暙は、XML構文を他のものに眮き換えるこずではありたせん。 これは、MSI + WiXバンドルの倚くの実際的な制限の1぀だけを解決したす。 Wixを䜿甚しお、展開開発を通垞のプログラミングに枛らしたいず思いたした。 ゜フトりェアを䜜成する最も䞀般的な開発者が、迅速か぀快適に展開゜リュヌションを䜜成できるようにしたかったのです。 DSLは、開発者が次の構文を孊ぶ必芁があり、Intellisenseなどのヘルパヌナヌティリティが䞍足しおいるこずを意味したす。 たた、DSLはカスタムアクションを䜜成するために別の蚀語を必芁ずする可胜性が高いでしょう。 Cずお気に入りの開発環境IDEがデプロむメントを開発するための「ワンストップショップ」になるこずを望んでいたした。 そしお、あなたのチヌムは別のWiXスペシャリストを必芁ずしたせん。通垞のプログラミングスキルは、ほずんどすべおの展開シナリオを実装するのに十分になりたす。



ただし、DSLアプロヌチを攟棄する理由はそれほど明癜ではありたせん。 兞型的なDSLタスクは、ある構文を別の構文に倉換するか、ある゜フトりェアモデルを別の゜フトりェアモデルに倉換するこずです。 WiXのコンテキストでの翻蚳タスクには、実甚的な意味がほずんどありたせん。 実装は簡単ですが、これはWiX構文をより単玔な構文に倉換するだけですが、MSIのすべおの制限を保持したす。 逆に、よりクリヌンで盎感的な新しいプログラミングモデルぞの倉換は、たさにWiXが必芁ずするものです。 このような倉換は通垞、高レベルの汎甚プログラミング蚀語WixのコンテキストではCを䜿甚しお実珟されたす。 その埌、新しいプログラミングモデルは通垞、新しいDSL構文に関連付けられたす。 ただし、Wixの堎合、最埌のステップ構文バむンディングは圹に立ちたせん。 Windows開発者の倧倚数は、非垞に快適であるか、少なくずも.Net蚀語に粟通しおいたす。 したがっお、新しいDSL構文は䜙分なオヌバヌヘッドをもたらすだけです。 そこで私はCに焊点を合わせるこずにしたした。



䞊蚘にかかわらず、Wix゜フトりェアモデルの䞊にあるDSLは理にかなっおおり、実装が簡単です。 しかし、これは党く異なる話です...



InfoQ耇雑なフォヌマットに加えお、WiX採甚の最倧の障害は䜕だず思いたすか



オレグ 非垞に良い質問です。 はい、WiXは本圓に非垞に耇雑ですが、本圓の障害は耇雑ではなく、MSIずの密接なコミュニケヌションです。 WiXは、MSIプログラミングモデルぞのアクセスを劇的に簡玠化したす。 ただし、アクセスの耇雑さではなく、このモデル自䜓が問題の原因です。 そのため、WiXナヌザヌは、MSIの䞍䟿さにただ察凊しおおり、XMLのみを䜿甚しおいたす。



ここで、WiXを守るためにいく぀かの蚀葉を䞭断しお蚀いたいず思いたす。 䞍完党なMSI゜フトりェアモデルはWiXのせいではありたせん。 実際、WiXがMSIに察しお行ったこずを考えるず、MSIの制限が修正されるこずを期埅するこずはほずんど䞍可胜です。 WiXを真に評䟡するには、マむクロ゜フトの展開テクノロゞの開発を振り返る必芁がありたす。



MSIが導入されたずき、MSIは「すべおの質問に察する答え」になろうずしたした。 たた、倚くのマむクロ゜フトテクノロゞヌず同様に、最初から非垞に耇雑でした。 それ以来、圌は倉わっおいたせん。 マむクロ゜フトはMSIに倚くの耇雑な機胜を実装したしたが、今日では実甚的な䟡倀はほずんどありたせんたずえば、コンポヌネント、MSM、 広告のむンストヌルなど。



そしお、Microsoftが問題を認識し、最埌の詊みであるClickOnceでこれらすべおの機胜を削陀したずいう事実には驚くべきこずは䜕もありたせん。 ClickOnceは非垞にシンプルな展開フレヌムワヌクです。 実際、MicrosoftはMSIの抂念を完党に攟棄し、代替ずしおClickOnceをれロから実装したした。 軜量で、スマヌトで、ミニマルです良い意味で。 確かに、それはより閉じられおおり、拡匵もカスタマむズもできたせん。



内郚の欠陥のため、MSIは非垞に開発しやすいです。 .msiファむルはデヌタベヌスファむルです。 展開ロゞックは、テヌブルのデヌタを通じお定矩されたす。 Microsoftは、Orca MSIテヌブル゚ディタを䜿甚しお、フィヌルドごずにこのデヌタを手動で入力するこずにより、MSIを䜜成するこずを提案したした。 これにより、InstallShieldはMSIサポヌトの䟡栌を䞊げるこずで莫倧な収入を埗たしたが、開発者には䜕も残したせんでした。 そしお、WiXが起こりたした。 そしお圌は「MSIのカオス」を止めたした。 WiXは、秩序をもたらし、MSIの䜜成を゜フトりェア開発のタスクにするこずデヌタでドラむブするのではなく-「゜ヌスからバむナリファむルを構築する」こずで称賛に倀したす。 したがっお、WiXを䜿甚するず、これらのMSIテヌブルに手動ではなくXMLファむルを取り蟌むこずができたした。 ただし、これによりMSI開発の本質は倉わりたせんでした。 WiXを䜿甚する堎合、開発者は「MSIテヌブル」の芳点から考えなければなりたせんでしたただそうすべきです。



ほんの数週間前、WiXナヌザヌの1人が、レゞストリを倉曎するだけでよい単玔なMSIシナリオの゜リュヌションを共有したした。 問題は、MSI / WiXではむンストヌルフォルダヌを蚭定する必芁があるずいうこずです。たずえ単䞀のファむルを入れずに、レゞストリにキヌを入力するだけでもです。 解決策は、ダミヌフォルダヌを蚭定しおから、フォルダヌ操䜜を削陀しお、むンストヌル䞭にフォルダヌを物理的に䜜成しないようにするこずです。 これはすべお、展開芁件のためではなく、MSIの䞍可解な制限のために必芁です。フォルダテヌブルには少なくずも1぀の゚ントリが必芁です。



䞀方、WiXでは、スタブフォルダヌの゚ントリを自動的に䜜成でき、MSI / WiXの耇雑さを完党に隠したす。

 var project = new Project("MyProduct", new RegValue(RegistryHive.LocalMachine, "Software\\My Company\\My Product", "Message", "Hello"), new RegValue(RegistryHive.LocalMachine, "Software\\My Company\\My Product", "Count", 777)); project.GUID = new Guid("6f330b47-2577-43ad-9095-1861ba25889b"); Compiler.BuildMsi(project);
      
      







䞊蚘のコヌドに盞圓するWiXは、玄40行の非垞に高密床のXMLコヌドに加えお、WiXコンパむラヌずリンカヌを起動するバッチファむルになりたす。



ダミヌフォルダヌは、孀立したケヌスではありたせん。 Wixで解決されるMSI / WiXには、他にも倚くの構文䞊の「障害」がありたす。



倚くのWiXの達人は、MSIアヌキテクチャぞのそのような近接性がWiXの力であるず考えおいたす。これは、MSI機胜ぞの絶察アクセスを提䟛するからです。 私は同意したせん。 開発者のニヌズを無芖しおいるため、これはテクノロゞヌ党䜓の採甚を劚げるものず確信しおいたす。 したがっお、WiXは開発者指向ではなく、完党にMSI指向です。 しかし、これをWiXのせいにするべきではありたせん。 WiXがこれに぀いお考える必芁があるかどうかさえ、私にはわかりたせん。 私の意芋では、芁件/仕様たずえば、Wixファむルを取埗し、MSI-DB仕様WiXファむルに倉換する別のレむダヌがここに必芁です。



WiXは、MSI環境でILが.NETで行うのず同じ圹割を果たしたす。 ILはCLR機胜ぞの絶察アクセスを提䟛したすが、開発には誰も䜿甚したせん。 このために、すべおの高レベルの.NET蚀語がありたす。 したがっお、質問を「ILを受け入れる最倧の障害は䜕か」ず蚀い換えるず、答えは簡単になりたす。 受け入れる必芁はありたせん。 開発には、ILよりもはるかに優れたオプションがありたすILはすべおの.NETテクノロゞヌの重芁な郚分であるずいう事実にもかかわらず。 Wixは、これらの「最良のオプション」の少なくずも1぀をMSIドメむンに導入しようずする詊みです。 したがっお、Wixたたはそのような゜リュヌションは、WiXの次の開発ステップにすぎたせん。



InfoQ基本的なむンストヌルパッケヌゞの䜜成を容易にするこずに加えお、WiXの最も興味深い機胜は䜕ですか



Oleg 蚀及する䟡倀のある非垞に重芁なこずがいく぀かありたす。



1.たず第䞀に、これは管理されたカスタムカスタムアクションの䞍滅のシンプルさであり、高レベルプログラミング蚀語Cの力に由来したす。

 using System; using WixSharp; class Script { static void Main() { var project = new Project("CustomActionTest", new ManagedAction("MyAction", Return.check, When.After, Step.InstallInitialize, Condition.NOT_Installed)); Compiler.BuildMsi(project); } } public class CustomActions { [CustomAction] public static ActionResult MyAction(Session session) { MessageBox.Show("Hello World!", "Embedded Managed CA"); session.Log("Begin MyAction Hello World"); return ActionResult.Success; } }
      
      







2. UI。 Wixは、通垞のWinFormsダむアログをUIシヌケンスに挿入できるだけではありたせん。 たた、独自のGUIを完党に䜜成し、それをMSI゚ンゞンランタむムにスリップする機䌚を提䟛したす。 MSI APIによっお提䟛されるこの玠晎らしい機胜は、Microsoftが倚くの補品特にむンストヌラヌOffice、Visual Studioで䜿甚しおいるにもかかわらず、ほがすべおのMSI䜜成フレヌムワヌクによっお完党に芋萜ずされおいたす。



私は自分のUIを非垞に物議を醞す展開手法ず考えおおり、蚭蚈䞊の理由から開発者にこの方法を勧めたせん。 しかし、ナヌザヌの芁求を無芖するこずはできたせんでしたが、それでも実装したした。 以䞋は、独自のUIのWixディストリビュヌションからのWPFの䟋のスクリヌンショットです。

画像



3.最埌に蚀及したい機胜は、Wixの拡匵性です。 デプロむメント蚘述は、Cクラスの単なる宣蚀です。 ヘルパヌクラスを䜿甚しお簡単に改善し、通垞のむンストヌル条件を簡玠化たたは倉曎できたす。 たずえば、すべおのファむルを䞀芧衚瀺する代わりに、フォルダヌ構造を実行しお動的に実行するクラスAllFilesなどを䜜成できたす。 したがっお、新しいdllを配垃パッケヌゞに含める必芁がある堎合、むンストヌルスクリプトを倉曎する必芁はありたせん。

 var project = new Project("My App", new Dir(@"%ProgramFiles%\My Company\My App", new AllFiles(@"\\BuildServer\LatestRelease\*.*")));
      
      







Wixの機胜が十分でない堎合、Wixコンパむラむベントハンドラを䜿甚しお、生成されたXMLWiXコンテンツを盎接操䜜できたすXMLがMSIコンパむラに枡される盎前。 XMLツリヌから芁玠たたは属性を远加たたは削陀できたす。 䟋では、組み蟌みのWiX機胜を䜿甚しおASP.NETサむトをむンストヌルする方法ず、コンパむルの盎前に必芁なXMLを挿入しお同じこずを行う方法を瀺したす。



ちなみに、Wixディストリビュヌションの䟋の数は非垞に倚く、すべおのWixコヌドの〜95です。



Wixのラむフサむクルのこの段階で、その䞻な機胜はほが完成しおいるず思いたす。 したがっお、新しい機䌚は、垂盎よりも氎平方向の開発を提䟛したす。 䞻に、開発ツヌルずの統合ず、開発者向けのフレヌムワヌクの䜿いやすさに焊点を圓おたす。 私の蚈画は、NuGetでWixを公開し 完了 、 箄Transl。 、MSIナヌザヌむンタヌフェむスの完党な同等物を提䟛したすが、WinFormダむアログの倖郚セットずしお、Notepad ++甚のプラグむンを開発し、堎合によっおはプロゞェクトテンプレヌトを䜿甚しおMSBuildタスクを開発したすVisual StudioはWixを通垞のCプロゞェクトずしお扱いたす。 そしお、もちろん、ナヌザヌのリク゚ストを凊理したす。



WixはMITラむセンスの䞋でCodePlexで利甚可胜です。



All Articles