Wixを使用したPostgreSQLの自動インストールと設定#

こんにちはHabr!



私が現在取り組んでいるプロジェクトは複雑であるため、各クライアントマシンにPostgreSQLを展開および構成する必要があります。 当社には多くのクライアントがいるため、PostgreSQLのセットアッププロセスを自動化し、MSIインストーラーを作成することが決定されました。



最近、ハブで、Wix#に関する翻訳された記事を読みました。







記事で述べたように、Wix#はC#スクリプトを実行できるオープンソースエンジンの一部です。

Wix#を読み込んだ後、アーカイブで多くの例を見つけることができます。ファイルの単純なコピーから始め、デスクトップでショートカットを作成し、WPFインストーラーの独自のダイアログで終わります。



タスクは次のとおりです。



最初の2つの点については詳しく説明しません;すべては例にあります。 DBMSを設定するには、pg_hba.confファイルを置き換え、保存されたコピーからデータベースをインポートする必要があります。 これらはすべて、インストーラーを起動したユーザーの参加なしで実行する必要があります。



まず、プロジェクトをデプロイするための簡単なインストーラーを作成します。 次に、Visual Studioの例を使用してこのようなインストーラーを作成する方法を説明しますが、これは完全にオプションです-任意のテキストエディターを使用できます。



C#で簡単なコンソールアプリケーションを作成し、

NuGetプロジェクトマネージャーを使用してソリューションのWixSharpをインストールします。



インストールを開始する前に、ユーザーは通常、インストール用のいくつかのコンポーネントから選択するように提供されます。Wix#には、このためのFeatureオブジェクトがあります。



インストール用のコンポーネントを作成し、



Feature fSoftware = new Feature("< >"); Feature fPostgreSQL = new Feature(" PostgreSQL"); //       , // ,      ,   fSoftware.Description = "  "; fPostgreSQL.Description = "   PostgreSQL";
      
      







Wixには、プロジェクトをビルドするためのさまざまなオブジェクトがあります。たとえば、ProjectまたはManagedProjectです。 後者は、インストールプロセス中に実行される独自のC#コードを追加できるという点で異なります。



インストーラーパッケージに含まれるファイルが配置されるディレクトリを定義します。



 var filesPath =Path.Combine( Path.GetFullPath( Path.Combine(System.Reflection.Assembly .GetExecutingAssembly().Location, @"..\..\..\")), "Files");
      
      







プロジェクトオブジェクトを作成し、インストールに必要なファイルを記述します。



 var project = new ManagedProject("  ", // Id  ,    //   Custom Actions   new Dir(new Id("INSTALL_DIR"), @"%ProgramFiles%\< >", //         new Files(fSoftware, Path.Combine( filesPath, @"<    >\*.*"))), // PostgreSQL     :\PostgreSQL // (   ) //          new Dir("C:\PostgreSQL", //   new WixSharp.File(fServer, Path.Combine(filesPath, @"postgresqlwin.exe")), //   new WixSharp.File(fServer, Path.Combine(filesPath, @"database.backup")), //   new WixSharp.File(fServer, Path.Combine(filesPath, @"pg_hba.conf")), // BAT- ( ) new WixSharp.File(fServer, Path.Combine(filesPath, @"installDB.bat"))) );
      
      







Wixでのインストール後またはインストール中にさまざまなアクションを実行するには、豊富な可能性があります。たとえば、ReportViewerをインストールする必要がある場合は、プロジェクト本体に追加する必要があります。



 new InstalledFileAction("ReportViewer.exe", "/q", Return.asyncNoWait, When.After, Step.InstallFinalize, Condition.NOT_Installed)
      
      







PostgreSQLをインストールして構成するには、InstalledFileActionなどを使用することもできますが、実行する必要があるコマンドが多いため、 InstallDB.bat BATファイルを作成することにしました。



 #       PostgreSQL SET PGPASSWORD=123456 #    C:\PostgreSQL\bin\createdb.exe --host localhost --port 5432 --username "postgres" --no-password <  > #   C:\PostgreSQL\bin\pg_restore.exe --host localhost --port 5432 --username "postgres" --dbname "  " --role "postgres" --no-password --verbose "C:\PostgreSQL\database.backup"
      
      







次に、プロジェクトを構成する必要があります。



  project.ControlPanelInfo.Manufacturer = "<  >"; project.GUID = new Guid("{F1CC4E21-0326-4107-BB5C-A834EAEF6DAE}"); project.LicenceFile = Path.Combine(filesPath, @"License.rtf"); project.UI = WUI.WixUI_Mondo; project.Language = "ru-RU"; project.OutFileName = "SetUp"; //   .Net Framework 4.0 project.SetNetFxPrerequisite("NETFRAMEWORK40FULL >= '#1'", ",  .NET Framework 4.0."); project.PreserveTempFiles = true; project.DefaultFeature = fSoftware; project.Version = new Version("1.0.0.1"); project.AfterInstall += AfterInstall; Compiler.BuildMsi(project);
      
      







AfterInstallイベントについては、カスタムアクションを記述して、PostgreSQLのインストールと設定を開始できます。



 private static void AfterInstall(SetupEventArgs e) { try { if ((e.Mode == SetupEventArgs.SetupMode.Installing) || (e.Mode == SetupEventArgs.SetupMode.Modifying)) { if (System.IO.File.Exists(@"C:\PostgreSQL\postgresqlwin.exe")) { var process = new Process(); process.StartInfo = new ProcessStartInfo(@"C:\PostgreSQL\postgresqlwin.exe", @"--prefix C:\PostgreSQL --mode unattended --datadir C:\PostgreSQL\data --superpassword 123456 --install_runtimes 0"); process.Start(); process.WaitForExit(); System.IO.File.Delete(@"C:\PostgreSQL\postgresqlwin.exe"); } if (System.IO.File.Exists(@"C:\PostgreSQL\pg_hba.conf")) { System.IO.File.Copy(@"C:\PostgreSQL\pg_hba.conf", @"C:\PostgreSQL\data\pg_hba.conf", true); System.IO.File.Delete(@"C:\PostgreSQL\pg_hba.conf"); } if (System.IO.File.Exists(@"C:\PostgreSQL\database.backup")) { if (System.IO.File.Exists(@"C:\PostgreSQL\installDB.bat")) { var pgProcess = new Process(); pgProcess.StartInfo = new ProcessStartInfo(@"C:\PostgreSQL\installDB.bat", "") { CreateNoWindow = true, UseShellExecute = false }; pgProcess.Start(); pgProcess.WaitForExit(); System.IO.File.Delete(@"C:\PostgreSQL\installDB.bat"); } else return; System.IO.File.Delete(@"C:\PostgreSQL\database.backup"); } } } catch (Exception ex) { System.Windows.MessageBox.Show("  : " + ex.ToString()); } }
      
      







または、PostgreSQLインストーラーを一時フォルダーにコピーし、そこからインストールを実行することもできます。



これらの簡単な手順で、PostgreSQLはソフトウェア用に自動的に構成されます。



ただし、Wix#について気に入らなかった瞬間があります。

1).NET Framework 3.5のみをサポート

2)一般的にWixでは、インストーラーからMSIインストーラーを起動することはできません。このため、WIX拡張機能を使用する必要があり、タスクが複雑になります。 そのため、インストールの完了後にReportViewerをインストールする必要がありました。

3)何らかの理由で、このコードに問題があります:



 new Dir(@"C:\Test1", ..), new Dir(@"C:\Test2", ..)
      
      





無効なパスに関するエラーが発行されます。 フォルダーを1つだけ残すと、すべてが機能します。



次のコードは機能しますが、部分的には:

 new Dir(@"C:\Test", new Dir(@"Test1",   feature1), new Dir(@"Test2",   feature2), )
      
      







理論的には、ファイルをTest1およびTest2ディレクトリにコピーする必要があります。これは、インストール中にfeature1およびfeature2を選択した場合に発生します。

また、インストール中にfeature1のみを選択し、feature2(インストールの変更)を追加すると、Test2フォルダーは表示されません。代わりに、feature2のファイルを含むABSOLUTEPATHフォルダーがあります。

確かに私のスクリプトでは何かが考慮されていませんでした。



一般的に、Wix#が好きでした。特に、WIX用のXMLに飛び込むことなくインストーラーをすばやく作成する必要がある場合は。



ソース:

  1. Wix翻訳記事
  2. Wix用のさまざまな開発ツールを設定するための段階的な手順#



All Articles