MSDeploy runCommand с использованием относительного пути - PullRequest
15 голосов
/ 01 февраля 2011

Я пытаюсь запустить команду как часть моего процесса упаковки / развертывания через MSDeploy.В частности, я пытаюсь создать собственный журнал событий, запустив installutil для одной из моих библиотек DLL, но у меня возникают проблемы с указанием относительного пути к библиотеке DLL из каталога развертывания.,Для начала я добавил приведенный ниже конфиг в мой csproj, чтобы сгенерировать провайдера runCommand внутри моего файла манифеста.Обратите внимание на абсолютный путь к 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.Как я могу сделать вышеуказанный вызов, используя относительный путь из моего каталога развертывания на веб-сайте по умолчанию?В идеале я хотел бы, чтобы MSDeploy взял этот путь и передал его в качестве переменной в оператор runCommand, чтобы найти DLL.Тогда я мог бы написать что-то вроде: <path>installutil $DeploymentDir\NewTestApp\bin\BusinessLayer.dll</path>, не беспокоясь о жестком кодировании абсолютного пути в.

Есть ли способ сделать это без использования абсолютного пути к моей DLL каждый раз?

Ответы [ 2 ]

4 голосов
/ 10 февраля 2011

Вы можете добавить определение 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>
1 голос
/ 04 февраля 2011

Я понимаю, что это не тот ответ, который вы, вероятно, хотели услышать, но именно так я его обошел.

Мы создали скрипт powershell на целевом сервере.Поэтому вместо запуска вашей команды:

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

Мы бы запустили:

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

"sitename" передается как параметр в сценарий powershell.Внутри скрипта он знает на этом конечном сервере, какие файлы устанавливать, какие команды нужно запускать, пулы приложений для перезапуска и т. Д.

Опять не так просто, как найти относительный путь, но он выполняет свою работу,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...