Может ли NuGet редактировать конфигурационный файл или только добавить к нему? - PullRequest
17 голосов
/ 01 августа 2011

Я работал над пакетом NuGet для своей компании, и одним из требований является возможность обновления некоторых наших файлов конфигурации.

Я знаю, что возможно добавить файл конфигурации, номожно редактировать один?

Пример:

<add name="conn" connectionString="Data Source=.\;Initial Catalog=DB;Integrated Security=True" />

изменяется на ниже

<add name="conn" connectionString="Data Source=.\;Initial Catalog=DB;User ID=ex;Password=example" />

Ответы [ 4 ]

30 голосов
/ 09 декабря 2011

Преобразования NuGet не могут редактировать существующие значения.Но NuGet позволяет запускать сценарии Powershell при установке пакета, поэтому вы можете редактировать файл конфигурации следующим образом.

Создайте файл Install.ps1 и используйте этот код:

# Install.ps1
param($installPath, $toolsPath, $package, $project)

$xml = New-Object xml

# find the Web.config file
$config = $project.ProjectItems | where {$_.Name -eq "Web.config"}

# find its path on the file system
$localPath = $config.Properties | where {$_.Name -eq "LocalPath"}

# load Web.config as XML
$xml.Load($localPath.Value)

# select the node
$node = $xml.SelectSingleNode("configuration/connectionStrings/add[@name='gveconn']")

# change the connectionString value
$node.SetAttribute("connectionString", "Data Source=.\;Initial Catalog=GVE;User ID=ex;Password=example")

# save the Web.config file
$xml.Save($localPath.Value)
15 голосов
/ 16 октября 2013

Начиная с NuGet 2.6 и выше, вы можете фактически преобразовывать файлы Web.config, используя синтаксис XDT, который используется для преобразований Web.config в Visual studio.

См. http://docs.nuget.org/docs/creating-packages/configuration-file-and-source-code-transformations:

Поддержка XML-Document-Transform (XDT)

Начиная с NuGet 2.6, XDT поддерживается для преобразования файлов XML внутри проекта.Синтаксис XDT можно использовать в файлах .install.xdt и .uninstall.xdt в папке «Содержимое» пакета, которые будут применены во время установки и удаления пакета соответственно.

Например, длядобавьте MyNuModule в файл web.config, как показано выше, в файле web.config.install.xdt можно использовать следующий раздел:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <system.webServer>
        <modules>
            <add name="MyNuModule" type="Sample.MyNuModule" xdt:Transform="Insert" />
        </modules>
    </system.webServer>
</configuration>

С другой стороны, чтобы удалить только элемент MyNuModule во времяудаление пакета, следующий раздел может быть использован в файле web.config.uninstall.xdt:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <system.webServer>
        <modules>
            <add name="MyNuModule" xdt:Transform="Remove" xdt:Locator="Match(name)" />
        </modules>
    </system.webServer>
</configuration>
3 голосов
/ 01 августа 2011

РЕДАКТИРОВАТЬ: Ответ теперь ДА с NUGET 2.6 и выше.

Ответ НЕТ . С сайта nuget я нашел следующий ответ:

"Когда NuGet объединяет файл преобразования с файлом конфигурации проекта, он только добавляет элементы или добавляет атрибуты к существующим элементам в файле конфигурации; он не изменяет существующие элементы или атрибуты каким-либо другим способом."

http://docs.nuget.org/docs/creating-packages/configuration-file-and-source-code-transformations

0 голосов
/ 16 марта 2016

Да, это возможно, но вы должны включить файл install.ps1 в папку tools . А затем, когда вы получите свой пакет с сервера nuget, Visual Studio запустит скрипты Powershell. Я использую этот скрипт

# fileName can be App.Config Or Web.Config or something else 
$fileName = "App.Config" 
$file=$project.ProjectItems.Item($fileName)

if($file.Properties){
    # Get localpath
    $localPath = $file.Properties.Item("LocalPath")
    if($localPath){
        $localPath = $localPath.Value   
    }
}

if ($localPath -eq $null) {
    Exit
}

#Load our config file as XML file
[xml]$file = Get-Content $localPath
if($file){

    # Create node 
    $childNode = $file.CreateElement("add")
    $childNode.SetAttribute("connectionString", "DataSource=.\;InitialCatalog=GVE;User ID=ex;Password=example")

    #Get parent node   
    $node = $file.SelectSingleNode("configuration/connectionStrings")

    #Insert our node into parent
    $node.AppendChild($childNode)

    $file.Save($localPath)
}
...