Создайте Nuget Pacakge с настройкой файла конфигурации облака (ServiceDefinition.csdef) - PullRequest
1 голос
/ 02 декабря 2011

Я хотел бы собрать пакет Nuget для моей надстройки, который будет использоваться конечными пользователями для установки в качестве задачи запуска, и после этого они будут загружать свои приложения на платформе Windows Azure.

Давайте рассмотрим один простойвеб-приложение и один облачный проект, теперь использующий конечного пользователя Nuget, добавит дополнительный пакет, добавит 2 файла (exe & config) в проект веб-приложения и добавит задачу запуска в ServiceDefinition.csdef облачного проекта, как показано на рисунке

enter image description here

Как я могу создать этот тип Nuget Pacakge?

Заранее спасибо.

Обновление:

Я попытался в соответствии с ответом NICK, однако у меня возникла проблема с 2 веб-ролями в облачном проекте, как показано на рисунке ниже.Cloud project with 2 webrole и ошибка, которую я получаю, как показано ниже

error to add startup task with powershell script

Также у меня есть один вопрос: если я устанавливаю этот пакет Nuget с командной строкой, то как я могу рассмотреть все веб-проектыдобавить exe и конфигурационный файл в решение ??

1 Ответ

3 голосов
/ 14 мая 2012

Пакеты Nuget работают в соответствии с соглашением: http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#From_a_convention_based_working_directory

Что касается exe и config, вы можете сделать следующее:

  1. В вашем каталоге пакетов сделайте следующие каталоги
    • mkdir lib (для exe)
    • mkdir content (для конфига)

Все, что вам нужно сделать для exeпоместите файл в каталог lib и измените ваш файл .nuspec прямо под узлом метаданных.Должен быть узел «файлы» (если вы не можете его добавить).Добавьте что-то вроде этого в файловый узел:

<file src="content\my.exe" target="content\my.exe" />

Конфигурация немного отличается.Просто добавьте файл с именем myname.config.transform в каталог содержимого и добавьте запись в файл .nuspec:

Несколько замечаний:

  1. Если файл конфигурациине существует в вашем приложении, он добавит один для вас.
  2. Вам нужно добавить только те узлы, которые вы хотите преобразовать, если уже существует файл, который существует
  3. Файл преобразования выполнит полное сопоставление на вашем узле, поэтому, если в * 1028 существует следующее

ваш файл конфигурации:

<add key="test" value="myval"/>

И в вашем преобразовании вы получили:

<add key="test" value="myval2"/>

Полученный файл будет выглядеть так:

<add key="test" value="myval"/>
<add key="test" value="myval2"/>

Что касается добавления задачи запуска, это было немного сложнее для меня (может быть, гораздо лучший способ).Я использую powershell в install.ps1 (как и файлы выше, но вы создаете для него каталог «tools»):

param($installPath, $toolsPath, $package, $project)

#Modify the service config - adding a new Startup task
$svcConfigFile = $DTE.Solution.Projects|Select-Object -Expand ProjectItems|Where-Object{$_.Name -eq 'ServiceDefinition.csdef'}
$ServiceDefinitionConfig = $svcConfigFile.Properties.Item("FullPath").Value
[xml] $xml = gc $ServiceDefinitionConfig

#Create startup and task nodes

# So that you dont get the blank ns in your node
$startupNode = $xml.CreateElement('Startup','http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition')
$taskNode = $xml.CreateElement('Task','http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition')
$taskNode.SetAttribute('commandLine','my.exe')
$taskNode.SetAttribute('executionContext','elevated')
$taskNode.SetAttribute('taskType','simple')
$startupNode.AppendChild($taskNode)

#Check to see if the startup node exists
$modified = $xml.ServiceDefinition.WebRole.StartUp
if($modified -eq $null){
    $modified = $xml.ServiceDefinition.WebRole
    $modified.PrependChild($startupNode)
}
else{
    $nodeExists = $false
    foreach ($i in $xml.ServiceDefinition.WebRole.Startup.Task){
        if ($i.commandLine -eq 'my.exe'){
            $nodeExists = $true
        }
    }
    if($taskNode -eq $null -and !$nodeExists){
        $modified.AppendChild($taskNode)
    }
}
$xml.Save($ServiceDefinitionConfig);

Надеюсь, это поможет.

- Ник

...