2011-02-01 3 views
15

Я пытаюсь запустить команду как часть процесса упаковки/развертывания через MSDeploy. В частности, я пытаюсь создать собственный журнал событий, запустив installutil против одной из моих DLL, но у меня возникли проблемы с указанием относительного пути к DLL из каталога развертывания. Для начала я добавил приведенную ниже конфигурацию в свой csproj, чтобы сгенерировать провайдер runCommand внутри моего файла манифеста. Обратите внимание на абсолютный путь к DLL.MSDeploy runCommand с использованием относительного пути

<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 это сгенерировало мой манифест правильно внутри моего пакета .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 каждый раз?

ответ

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. Внутри сценария он знает на этом целевом сервере, какие файлы для установки, какие команды нужно запускать, пулы приложений для переработки и т. Д.

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

+1

Это, кажется, несколько официальная рекомендация тоже: http://social.msdn.microsoft.com/Forums/en/msbuild/thread/1044058c-f762-456b-8a68-b0863027ce47 –

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> 

Theese условиях позволит изменить все из командной строки, чтобы получить полный контроль над процессом сборки в системе сборки или скрипт.

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

Это будет работать только для DeploymentDir, указанного во время сборки. Но как только пакет развертывания будет развернут на веб-сайт Production, кто знает, какой будет каталог физического развертывания на целевой машине. –

Смежные вопросы