2011-02-01 16 views
15

MSDeployを使用してパッケージ化/展開プロセスの一部としてコマンドを実行しようとしています。特に、私はinstallutilを私のDLLの1つに対して実行してカスタムイベントログを作成しようとしていますが、相対パスをデプロイメントディレクトリから指定することに問題があります。まず、Manifestファイルの中にrunCommandプロバイダを生成するために、以下の設定をcsprojに追加しました。 DLLへの絶対パスに注意してください。MSDeploy相対パスを使用したrunCommand

<PropertyGroup> 
    <!-- Extends the AfterAddIisSettingAndFileContentsToSourceManifest action to create Custom Event Log --> 
    <IncludeEventLogCreation>TRUE</IncludeEventLogCreation> 
    <AfterAddIisSettingAndFileContentsToSourceManifest Condition="'$(AfterAddIisSettingAndFileContentsToSourceManifest)'==''"> 
     $(AfterAddIisSettingAndFileContentsToSourceManifest); 
     CreateEventLog; 
    </AfterAddIisSettingAndFileContentsToSourceManifest> 
    </PropertyGroup> 
    <Target Name="CreateEventLog" Condition="'$(IncludeEventLogCreation)'=='TRUE'"> 
    <Message Text="Creating Event Log" /> 
    <ItemGroup> 
     <MsDeploySourceManifest Include="runCommand"> 
     <path>installutil C:\inetpub\wwwroot\MyTestApp\bin\BusinessLayer.dll</path> 
     </MsDeploySourceManifest> 
    </ItemGroup> 
    </Target> 
    <ItemGroup> 

msbuildを呼び出した後、これは正しく私のpackage.zipの中に私のマニフェストを生成しました。私はMyTestApp.deploy.cmd/Yを実行したとき、それは正しく場合msdeployと呼ばれ、\ wwwrootの\ MyTestAppをINETPUBために私のファイルを展開し、以下のマニフェストからの私のコマンドを実行した:

<runCommand path="installutil C:\inetpub\wwwroot\MyTestApp\bin\BusinessLayer.dll ... etc 

を私が午前問題は、私はありますこのDLLパスをc:\ inetpub \ etcにハードコーディングする必要はありません。既定のWebサイトの相対パスを展開ディレクトリから使用して上記の呼び出しを行うにはどうすればよいですか。理想的には、私はMSDeployにこのパスをとり、変数をrunCommandステートメントに渡してDLLを見つけることをお勧めします。それでは、<path>installutil $DeploymentDir\NewTestApp\bin\BusinessLayer.dll</path>と書くことができます。

私のDLLの絶対パスを毎回使用しないとこれを行う方法はありますか?

答えて

1

私はこれがあなたがおそらく聞きたかった答えではないことを認識していますが、これは私がその周りを回った方法です。

ターゲットサーバーでpowershellスクリプトを作成しました。だからではなく、あなたのコマンドを実行しているの:

installutil C:\inetpub\wwwroot\MyTestApp\bin\BusinessLayer.dll ... etc 

我々は実行します:

c:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe d:\powershell\installSites.ps1 siteName <NUL 

を「サイト名は」PowerShellスクリプトへのparamとして渡されています。スクリプト内では、インストール先のファイル、実行する必要のあるコマンド、リサイクルするアプリケーションプールなどがわかります。

また、相対パスを見つけるのは簡単ではありませんが、ジョブは実行します。

+1

を使用することができます。これは、あまりにも、多少の公式の推薦のようだ:http://social.msdn.microsoft.com/Forums/en/msbuild/thread/1044058c-f762-456b-8a68-b0863027ce47 –

4

あなたは上に書いたアクションと.csprojにDeploymentDirの定義を追加することができます。

<PropertyGroup> 
<DeploymentDir Condition="'$(Configuration)'=='Release' AND '$(DeploymentDir)'==''">Release Deployment Dir</DeploymentDir> 
<DeploymentDir Condition="'$(Configuration)'=='Debug' AND '$(DeploymentDir)'==''">Debug Deployment Dir</DeploymentDir> 
<DeploymentDir Condition="'$(DeploymentDir)'==''">C:\inetpub\wwwroot</DeploymentDir> 
<AplicationName Condition="'$(Configuration)'=='Release' AND '$(AplicationName)'==''">NewTestApp</AplicationName> 
<AplicationName Condition="'$(Configuration)'=='Debug' AND '$(AplicationName)'==''">MyTestApp</AplicationName> 
<ApplicationDeploymentDir Condition="'$(ApplicationDeploymentDir)'==''">$(DeploymentDir)\$(ApplicationName)\bin</ApplicationDeploymentDir> 
</PropertyGroup> 

Theese条件は、ビルドシステムでビルドプロセスを完全に制御を取るために、コマンドラインからすべてを変更することができますまたはスクリプトです。

MSBuild.exe yourproj.proj /p:Configuration=Release /p:DeploymentDir=D:\package /p:ApplivationName=BestAppForever 

そして、あなたのタスクの内部で、あなたはそれを

<ItemGroup> 
    <MsDeploySourceManifest Include="runCommand"> 
    <path>installutil $(ApplicationDeploymentDir)\BusinessLayer.dll</path> 
    </MsDeploySourceManifest> 
</ItemGroup> 
+4

ビルド時に指定したDeploymentDirに対してのみ有効です。しかし、いったん展開パッケージが実稼働のWebサイトに展開されると、物理展開ディレクトリがターゲットマシン上にどのようなものになるかを知っています。 –