読者です 読者をやめる 読者になる 読者になる

Web Deployを使ってファイルの配置

(Web Deploy 3.0 Microsoft.Web.Deployment C# -preSync -postSync)
Microsoft Web Deploy3.0を使ってリモートサーバに簡単に配置することが可能です。
基本的には、VisulaStudioから実行するかmsdeploy.exeをコマンドラインから実行するかになります。
が様々な理由でC#上から実行したい時がありました。
(条件に合わせてパラメーターを変更したいとか)

tech.tanaka733.net
こちらの記事を参考にして試していましたが決定的な違いが

・記事ではIISに対してアプリを発行しているが、やりたいのはファイルの配置をやりたい
・preSyncとpostSyncを使って前後でコマンドを実行したい

C#実行したい内容

msdeploy.exe 
-verb:sync 
-source:dirPath="配置元ディレクトリ" 
-dest:computerName="http://配置先コンピュータ/MSDeployAgentService",userName="ドメイン名\ユーザー名",password="パスワード",includeAcls="False",dirPath=配布先ディレクトリ 
-enableRule:DoNotDeleteRule 
-preSync:runcommand="C:\Tools\配置前実行.bat" 
-postSync:runcommand="C:\Tools\配置後実行.bat"

ディレクトリを同期

こんな感じですぐに分かりました。

var sourceBaseOptions = new DeploymentBaseOptions();
var destBaseOptions = new DeploymentBaseOptions()
{

  ComputerName = "http://配置先コンピュータ/MSDeployAgentService",
  UserName = @"ドメイン名\ユーザー名",
  Password = "パスワード",
  IncludeAcls = false,
};

sourceBaseOptions.Trace += trace;
destBaseOptions.Trace += trace;

var deploymentObject = DeploymentManager.CreateObject(
  DeploymentWellKnownProvider.DirPath,
  @"配置元ディレクトリ",
  sourceBaseOptions);

var syncOptions = new DeploymentSyncOptions();
//-enableRule:DoNotDeleteRule
syncOptions.DoNotDelete = true;

//-verb:sync を実行
var changes = deploymentObject.SyncTo(DeploymentWellKnownProvider.DirPath, @"配布先ディレクトリ", destBaseOptions, syncOptions);

実行にはC:\Program Files\IIS\Microsoft Web Deploy V3\Microsoft.Web.Deployment.dllの参照追加が必要です。

が-preSyncと-postSyncの実行方法がまったくわからず。
調べ方もよくわからず。

そこで必殺
アセンブリ
わからない時は大抵これでなんとかなります

C:\Program Files\IIS\Microsoft Web Deploy V3
Microsoft.Web.Deployment.dll
msdeploy.exe

この2つを覗いてわかったこと。
-preSyncと-postSyncは、配置を実行する前後に、RunCommandを実行している

msdeploy.exeは引数を受け取って
1. RunCommand(preSync)を実行
2. Sync(DirPath)を実行
3. RunCommand(postSync)を実行
としていること

RunCommandの実行

var destBaseOptions = new DeploymentBaseOptions()
{

  ComputerName = "http://配置先コンピュータ/MSDeployAgentService",
  UserName = @"ドメイン名\ユーザー名",
  Password = "パスワード",
  IncludeAcls = false,
};

var syncOptions = new DeploymentSyncOptions();
var verboseLevel = new DeploymentBaseOptions();

verboseLevel.Trace += trace;
destBaseOptions.Trace += trace;
using (DeploymentObject deploymentObject = DeploymentManager.CreateObject(DeploymentWellKnownProvider.RunCommand, @"実行コマンド", verboseLevel))
{
  deploymentObject.SyncTo(destBaseOptions, syncOptions);
}

こでハマったのが実行したいコマンドをどこで指定すればいいかわからない。結果としてDeploymentManager.CreateObjectの第二引数に実行したいコマンドを書けばよかったですが、これも時間かかりました。

なんだかなー

今回、

逆あせんプリには、
Telerik JustDecompiler free .NET decompiler
を使用しました。
完全に復元はできませんが、アセンブリ(dll,exe)からプロジェクトを復元できるので調べ事などには便利です。