Domanda

Sto cercando di eseguire un comando come parte del mio processo di imballaggio/distribuzione tramite MSDeploy. In particolare, sto cercando di creare un registro di eventi personalizzati in esecuzione InstallaTil contro una delle mie DLL, ma ho problemi a specificare a percorso relativo alla DLL dalla directory di distribuzione. Per iniziare, ho aggiunto la configurazione seguente al mio CSPROJ per generare il provider RunCommand all'interno del mio file manifest. Si prega di notare il percorso assoluto per la 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>

Dopo aver chiamato MSBuild, questo ha generato il mio manifesto correttamente all'interno del mio pacchetto.zip. Quando ho corso Mytestapp.deploy.cmd /y Chiama correttamente MSDeploy e distribuito i miei file su iNetPUB wwwroot mytestapp e ha eseguito il mio comando dal manifest di seguito:

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

Il problema che sto riscontrando è che non voglio codificare questo percorso DLL su C: INETPUB ecc. Come posso effettuare la chiamata sopra usando il percorso relativo Dalla mia directory di distribuzione con il sito Web predefinito? Idealmente, vorrei MSDeploy Per prendere questo percorso e passare come variabile all'istruzione RunCommand per trovare la DLL. Allora potrei scrivere qualcosa di simile: <path>installutil $DeploymentDir\NewTestApp\bin\BusinessLayer.dll</path> senza doversi preoccupare di codificare duramente un percorso assoluto.

C'è un modo per farlo senza usare il percorso assoluto per la mia DLL ogni volta?

È stato utile?

Soluzione

Mi rendo conto che questa non è la risposta che probabilmente volevi sentire, ma è così che l'ho aggirato.

Abbiamo creato uno script PowerShell sul server di destinazione. Quindi, invece di eseguire il tuo comando:

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

Vorremmo correre:

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

Il "SiteName" viene trasmesso come parametro nello script PowerShell. All'interno dello script conosce su quel server di destinazione quali file installare, tutti i comandi che devono eseguire, pool di app per riciclare, ecc.

Ancora una volta, non facile come trovare un percorso relativo, ma fa il lavoro.

Altri suggerimenti

Puoi aggiungere la definizione di DeploymentDir a .csproj con l'azione che hai scritto sopra:

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

Questi condizioni consentiranno di modificare tutto, dalla riga di comando per assumere il pieno controllo sul processo di build nel sistema di build o nel script.

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

E all'interno del tuo compito puoi usarlo

<ItemGroup>
  <MsDeploySourceManifest Include="runCommand">
    <path>installutil $(ApplicationDeploymentDir)\BusinessLayer.dll</path>
  </MsDeploySourceManifest>
</ItemGroup>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top