15

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

<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が正しく呼び出され、ファイルがinetpub \ wwwroot \ MyTestAppにデプロイされ、以下のマニフェストからコマンドが実行されました。

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

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

毎回DLLへの絶対パスを使用せずにこれを行う方法はありますか?

4

2 に答える 2

4

上記で記述したアクションを使用して、DeploymentDirの定義を.csprojに追加できます。

<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>

これらの条件により、コマンドラインからすべてを変更して、ビルドシステムまたはスクリプトのビルドプロセスを完全に制御できます。

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>
于 2011-02-10T10:26:09.623 に答える
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 スクリプトに渡されます。スクリプト内では、宛先サーバーでインストールするファイル、実行する必要があるコマンド、リサイクルするアプリ プールなどを認識します。

繰り返しますが、相対パスを見つけるほど簡単ではありませんが、うまくいきます。

于 2011-02-04T15:32:39.573 に答える