MSDeploy runCommand с использованием относительного пути
Я пытаюсь выполнить команду как часть процесса упаковки / развертывания через MSDeploy. В частности, я пытаюсь создать пользовательский журнал событий, запустив наиболее важных системных против одной из моих библиотек 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:inetpubwwwrootMyTestAppbinBusinessLayer.dll</path>
</MsDeploySourceManifest>
</ItemGroup>
</Target>
<ItemGroup>
После вызова msbuild, это сгенерировало мой манифест правильно внутри моего пакета.застежка-молния. Когда я запустил MyTestApp.развертывать.cmd / Y он правильно вызвал msdeploy и развернул мои файлы в inetpubwwwrootMyTestApp и выполнил мою команду из манифеста ниже:
<runCommand path="installutil C:inetpubwwwrootMyTestAppbinBusinessLayer.dll ... etc
Проблема, с которой я сталкиваюсь, заключается в том, что я не хочу жестко кодировать этот путь DLL c:inetpubetc. Как я могу сделать вышеупомянутый вызов, используя относительный путь из моего каталога развертывания под веб-интерфейсом по умолчанию Сайт? В идеале, я хотел бы MSDeploy взять этот путь и передать его в качестве переменной оператору runCommand, чтобы найти DLL. Тогда я мог бы написать что-то вроде: <path>installutil $DeploymentDirNewTestAppbinBusinessLayer.dll</path>
, не беспокоясь о жестком кодировании абсолютного пути.
Есть ли способ сделать это без использования абсолютного пути к моей DLL каждый раз?
2 ответа:
Я понимаю, что это не тот ответ, который вы, вероятно, хотели услышать, но это то, как я его обошел.
Мы создали скрипт 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. Внутри скрипта он знает на этом целевом сервере, какие файлы устанавливать, какие команды запускать, пулы приложений утилизировать и т. д.
Опять же, не так просто как и поиск относительного пути, но он делает свою работу.
Вы можете добавить определение 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>