2010-07-06 83 views
3

我想在TeamCity服务器上使用MSBUILD在我的web.config中更改connectionString。以前我有使用属性在目标调用此:更改带有msbuild的connectionstrings

<PropertyGroup> 
<UpdateWebConfigCode> 
<![CDATA[ 
    public static void ScriptMain() 
    { 
    XmlDocument wcXml = new XmlDocument(); 
    wcXml.Load(@"TCM.MVC.UI\Web.config"); 

    XmlElement root = wcXml.DocumentElement; 
    XmlNodeList connList = root.SelectNodes("//connectionStrings/add"); 
    XmlElement elem; 

    foreach (XmlNode node in connList) 
    { 
    elem = (XmlElement)node; 

    switch (elem.GetAttribute("name")) 
    { 
    case "TCMBaseConnectionString": 
     elem.SetAttribute("connectionString", "Data Source=server-name;Initial Catalog=TCMCentral;User ID=user;Password=something"); 
     break; 

    } 
    } 

    wcXml.Save(@"TCM.MVC.UI\Web.config");   

    } 
]]> 
</UpdateWebConfigCode> 

然后,我会叫它目标:

<Target Name="UpdateWebConfig">   
    <Script Language="C#" Code="$(UpdateWebConfigCode)" Imports="System.Xml" /> 
</Target> 

但这种不断抛出一个错误。我意识到这可能是有点过时,但无法找到任何东西来取代它....任何建议?

回答

3

我这样做有一个自定义的任务,它不一样一样的代码,但MSBuidl变为:

<UpdateConnectionString ConfigFile ="path\to\web.config" 
     ConnectionStringName="MyConnectionStringName" 
     ConnectionString="connection-string-here"/> 

这种任务的代码是

public class UpdateConnectionString : Task 
    { 
     [Required] 
     public string ConfigFile { get; set; } 
     [Required] 
     public string ConnectionStringName { get; set; } 
     [Required] 
     public string ConnectionString { get; set; } 

     public override bool Execute() 
     { 
      try 
      { 
       var fi = new FileInfo(ConfigFile); 
       if(!fi.Exists) 
       { 
        Log.LogError("File {0} does not exist"); 
        return false; 
       } 
       fi.IsReadOnly = false; 
       XDocument doc = XDocument.Load(ConfigFile); 
       var confignode = doc.Descendants("configuration").Single(); 
       var connectionStrings = confignode.Descendants("connectionStrings").SingleOrDefault(); 
       if(connectionStrings == null) 
       { 
        connectionStrings = new XElement("connectionStrings"); 
        confignode.Add(connectionStrings); 
       } 
       var connectionElement = connectionStrings.Descendants("add").SingleOrDefault(
        e => e.Attribute("name") != null && 
         string.Compare(e.Attribute("name").Value, ConnectionStringName, 
             StringComparison.OrdinalIgnoreCase) == 0); 
       if (connectionElement == null) 
       { 
        connectionElement = new XElement("add", new XAttribute("name", ConnectionStringName)); 
        connectionStrings.Add(connectionElement); 
       } 

       connectionElement.SetAttributeValue("connectionString", ConnectionString); 
       doc.Save(ConfigFile); 
      } 
      catch (Exception ex) 
      { 
       Log.LogErrorFromException(ex, true); 
       return false; 
      } 
      return true; 
     } 
    } 

注意,这如果代码不存在,代码也会添加一个连接字符串,这可能比您现在需要的更复杂。

+0

杰米,感谢您的帮助。我最终在MSBuildCommunityTasks中使用了XmlUpdate属性。请参阅下面的答案。再次感谢。 Andrew – abarr 2010-07-06 13:26:32

5

我结束了使用MSBuildCommunityTasks XmlUpdate属性。以下是我的目标:

<Target Name="UpdateWebConfig">   
    <XmlUpdate XmlFileName="C:\TCM.NET\Current\TCM.MVC.UI\web.config" XPath="configuration/connectionStrings/add[@name='TCMBaseConnectionString']/@connectionString" Value="Data Source=server-name;Initial Catalog=TCMCentral;User ID=user;Password=something" /> 
</Target> 

这对我很好。

+0

不错的选择,我也开始更改为更通用的“UpdateXml”类型任务,尽管我自己创作的是MSBuildCommunity之一。 – Jamiec 2010-07-06 14:07:27