NuGet可以编辑配置文件还是只添加它?

时间:2011-08-01 17:12:58

标签: nuget nuget-package

我一直在为我公司制作一个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 个答案:

答案 0 :(得分:30)

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)

答案 1 :(得分:15)

从NuGet 2.6及更高版本开始,您实际上可以使用在Visual Studio中用于Web.config转换的XDT语法来转换Web.config文件。

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

支持XML-Document-Transform(XDT)

从NuGet 2.6开始,支持XDT转换项目中的XML文件。 XDT语法可以在包的Content文件夹下的.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>

答案 2 :(得分:3)

编辑:从NUGET 2.6及以上版本开始,答案为

答案是。从nuget网站我找到了以下答案:

“当NuGet将转换文件合并到项目的配置文件中时,它只会向配置文件中的现有元素添加元素或添加属性;它不会以任何其他方式更改现有元素或属性。”

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

答案 3 :(得分:0)

是的,可以,但您必须将 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)
}