Msdeploy runcommand с использованием относительного пути
-
28-10-2019 - |
Вопрос
Я пытаюсь запустить команду как часть моего процесса упаковки/развертывания через 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 это сгенерировало мое манифест в моем пакете. Когда я побежал 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 каждый раз?
Решение
Я понимаю, что это не тот ответ, который вы, вероятно, хотели услышать, но именно так я это обошел его.
Мы создали скрипт 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. Внутри сценария он знает на этом назначенном сервере, который будет установлен файлы, любые команды, которые необходимо запускать, пулы приложений для переработки и т. Д.
Опять же, не так просто, как найти относительный путь, но он делает работу.
Другие советы
Вы можете добавить определение 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>