2011-08-01 15 views
17

He estado trabajando en un paquete NuGet para mi empresa y uno de los requisitos es poder actualizar algunos de nuestros archivos de configuración.¿Puede NuGet editar un archivo de configuración o solo agregarlo?

Sé que es posible agregar un archivo de configuración, pero ¿es posible editar uno?

Ejemplo:

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

cambios a continuación

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

Respuesta

15

A partir de NuGet 2.6 y superiores, en realidad se puede transformar archivos Web.config utilizando la sintaxis TXD que se utiliza para Web.config transforma en Estudio visual.

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

soporte para XML-documento-Transform (TXD)

A partir de NuGet 2.6, TXD está soportado para transformar archivos XML dentro de un proyecto. La sintaxis XDT se puede utilizar en los archivos .install.xdt y .uninstall.xdt en la carpeta de contenido del paquete, que se aplicarán durante la instalación del paquete y la hora de desinstalación, respectivamente.

Por ejemplo, para agregar a MyNuModule archivo web.config que lo que está ilustrado arriba, la siguiente sección se puede utilizar en el archivo 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> 

Por otra parte, a eliminar sólo el elemento MyNuModule durante la desinstalación de paquetes, la siguiente sección puede ser utilizado en el archivo 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> 
+0

cualquier forma de evitar que esto se aplique al proyecto consumiendo el paquete te nuget? –

+2

¿No era ese el objetivo real de la pregunta original? ¿Aplicar ti al proyecto consumidor? –

3

Editar: la respuesta es ahora como de Nuget 2,6 y por encima.

La respuesta es NO. Desde el sitio Nuget me encontré con la siguiente respuesta:

"Cuando NuGet fusiona un archivo de transformación en el archivo de configuración de un proyecto, sólo añade elementos o añade atributos a los elementos existentes en el fichero de configuración; no cambia elementos o atributos existentes de cualquier otra manera ".

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

+0

Sí, eso es correcto.El motor de transformación no cubre todos los escenarios, aunque podemos ampliarlo en el futuro. –

+0

Esta respuesta ya no es correcta. Por favor, mira la respuesta de Erik. –

30

transforma NuGet no pueden editar los valores existentes. Pero NuGet le permite ejecutar secuencias de comandos de Powershell en la instalación del paquete, por lo que puede editar el archivo de configuración de esa manera.

Crear un archivo Install.ps1 Utilizando este código:

# 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) 
0

Sí, es posible, pero hay que incluir archivo en install.ps1 herramientas carpeta. Y luego, cuando obtenga su paquete del servidor Nuget, Visual Studio ejecutará los scripts de Powershell. Uso este script

# 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) 
} 
Cuestiones relacionadas