2013-04-24 18 views
7

Obecnie próbuję zmodyfikować mój instalator Wix (V3.5), aby edytować ustawienia Web.config aplikacji .NET, którą chcę zainstalować. Jest to w porządku dla zwykłych aplikacji ASP.NET, ale teraz próbuję zastosować mój projekt konfiguracji Wix do aplikacji Entity Framework .NET, która, jak być może wiesz, ma bardziej skomplikowane ustawienie ciągu połączenia z ustawieniami modelu .csdl i .ssdl.Edycja ustawień połączenia internetowego Web.Config z Wix

Więc jeśli moje web.config ustawienie ciąg połączenia wygląda somehting tak: (gdzie [DBSERVER] & [DBNAME] są właściwości retrived z okna dialogowego)

<connectionStrings> 
    <add name="SSITacticalSolutionEntities" connectionString="metadata=res://*/Model.TacticalSolutionModel.csdl|res://*/Model.TacticalSolutionModel.ssdl|res://*/Model.TacticalSolutionModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=sd-sql2008r2;Initial Catalog=SsiTacticalSolution1.2.4;Integrated Security=True;MultipleActiveResultSets=True&quot; /> 
    </connectionStrings> 

I edytować Web.config w moim plik Product.Wsx z somehting tak:

<util:XmlFile Id="ModifyConnectionString" Action="setValue" Permanent="yes" File="[INSTALLLOCATION]Web.config" 
        ElementPath="/configuration/connectionStrings/add[\[]@name='!(loc.EntityName)'[\]]" Name="connectionString" 
        Value="Data Source=[DBSERVER];Initial Catalog=[DBNAME];Integrated Security=true;providerName=System.Data.EntityClient;MultipleActiveResultSets=True&quot;" Sequence="5"/> 

otrzymuję ciąg połączenia tak:

<connectionStrings> 
     <add name="SSITacticalSolutionEntities" connectionString="Data Source=sd-sql2008r2;Initial Catalog=SsiTacticalSolution1.2.4;Integrated Security=true;providerName=System.Data.EntityClient;MultipleActiveResultSets=True&quot;"/> 
    </connectionStrings> 

Co oczywiście ma sens, ponieważ poproszę o zastąpienie bieżącego atrybutu ciągu połączenia tym, co zdefiniowałem w wartości.

Ale naprawdę potrzebuję tutaj edytować określone części ciągu połączenia i pozostawić resztę (czy jest tu jakaś zamiana, którą można tutaj użyć), tj. pozostaw wszystkie moje ustawienia modelu w miejscu i po prostu zamień serwer bazy danych i nazwę itp., tak jak potrzebuję. Zrobiłem to z instalatorami Visual Studio bez problemu i było tak łatwe w użyciu.

Moje pytanie brzmi: czy można to zrobić za pomocą util.XMLFile, czy może użyć: XmlConfig? Próbowałem obu bez żadnego szczęścia.

Czy nie można tego zrobić z plikiem util.XMLFile i czy będę musiał to zrobić w trybie CustomAction? Wszelkie pomysły będą bardzo pomocne, z góry dzięki ...

Odpowiedz

8

Mam to działa na końcu, w końcu nie użyłem niestandardowych akcji dla tego konkretnego ustawienia, używam zmiennych skonfigurowanych w moim pliku lokalizacyjnym.

Zrobiłem to, ponieważ byłby to raczej dev niż użytkownik, który znał nazwę modelu i nazwę obiektu (nie byłby użytkownikiem przez okno dialogowe instalacji, nie znałby tych informacji), więc mam plik lokalizacyjny z różnymi właściwościami, takimi jak nazwa produktu itp., więc dodałem w nazwie modelu i przypisuję do tego nazwę. Wszystko, co dostaję z okien dialogowych wprowadzonych przez użytkownika: np. Nazwa bazy danych, katalog wirtualny, podszywanie się pod użytkownika itp.

Jeśli to pomaga każdemu, oto, co wymyśliłem na końcu dla mojego web.config; To jest sekcja mojego produktu.wxs, który zajmuje się tym problemem. Jak widać mam właściwość ciąg połączenia na górze, z zastępczy dla loc.ModelName który jest ustawiony w moim pliku lokalizacyjnego:

<Property Id="CONNECTION_STRING" 
    Value="metadata=res://*/Model.!(loc.ModelName).csdl|res://*/Model.!(loc.ModelName).ssdl|res://*/Model.!(loc.ModelName).msl;provider=System.Data.SqlClient;provider connection string=&quot;"/> 

<!-- The root of the installer. --> 
<Directory Id='TARGETDIR' Name='SourceDir'> 

    <!-- Install into the inetpub/wwwroot directory --> 
    <Directory Id="IISMain" Name='inetpub'> 
    <Directory Id="WWWMain" Name='wwwroot' ComponentGuidGenerationSeed='C38ED13E-E1E3-40DB-B1FA-39400C6B2BC4'> 


     <Directory Id='INSTALLLOCATION' Name="!(loc.ProductName)"> 

     <!-- The component to define the Virtual Directory.--> 
     <Component Id="WebVirtualDirComponent" 
        Guid="D814F88F-6E0C-4365-A411-2F9807522C3D"> 

      <!-- WebVirtualDir: The virtual directory we are installing. --> 
      <!-- Alias:   Alias attribute is the name that we will see in IIS.--> 
      <!-- Directory:  The Directory attribute is the "Physical Path" property in 
          IIS and needs to tie to the ID specified above as the install location. --> 
      <!-- WebSite:  The WebSite attribute ties to a <WebSite> element in the 
          setup file(see below). As this is an example of installing into the 
          "Default Web Site" so that element is not under a component.--> 
      <iis:WebVirtualDir Id="VDir" Alias="[VIRTUALDIRECTORYVALUE]" 
          Directory="INSTALLLOCATION" 
           WebSite="DefaultWebSite"> 

      <!-- This turns the Virtual Directory into a web application. --> 
      <iis:WebApplication Id="MyWebAppApplication" 
           Name="[VIRTUALDIRECTORYVALUE]" WebAppPool="AppPool"/> 

      <iis:WebDirProperties Id="WebSite_Properties" AnonymousAccess="no" 
            WindowsAuthentication="yes" DefaultDocuments="!(loc.DefaultDocument)" 
            Script="yes" Read="yes" /> 

      </iis:WebVirtualDir> 
      <CreateFolder/> 
      <RemoveFolder Id= "GuidFolders" On= "uninstall"/> 
     </Component> 

     <!-- Components - this decides what we want to incude in our install 
     Here we will alter our web.config for Impersonation , debug to false and connection string. --> 
     <Component Id="Web.config" Guid="2ED81B77-F153-4003-9006-4770D789D4B6"> 

      <!--install our web.config file , this isnt part of our initial MSBUILD--> 
     <File Id="Web.config" Name="Web.config" Source="$(var.SolutionDir)!(loc.WebApplicationProjectName)\Web.config" DiskId="1" KeyPath="yes" /> 

      <!--Modify our web.config - here we need to add Identity impersonation , changes session settings , add connection string settings and set debug setting--> 
      <!--Ensure that the identity setting exists--> 
      <util:XmlFile Id="system.webidentity" 
         File="[INSTALLLOCATION]Web.config" 
         Action="createElement" 
         ElementPath="/configuration/system.web" 
         Name="identity" 
         SelectionLanguage="XPath" 
         Sequence="1" /> 

      <util:XmlFile Id="system.webIdentityAttribute" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/identity" 
         Name="impersonate" 
         Value="true" 
         SelectionLanguage="XPath" 
         Sequence="2" /> 

      <util:XmlFile Id="system.webIdentityAttribute2" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/identity" 
         Name="password" 
         Value="[IMPERSONATIONUSERPASSWORD]" 
         SelectionLanguage="XPath" 
         Sequence="3" /> 

      <util:XmlFile Id="system.webIdentityAttribute3" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/identity" 
         Name="userName" 
         Value="[IMPERSONATIONUSER]" 
         SelectionLanguage="XPath" 
         Sequence="4" /> 

      <util:XmlFile Id="ModifyConnectionString" 
         Action="setValue" 
         Permanent="yes" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/connectionStrings/add[\[]@name='!(loc.EntityName)'[\]]" 
         Name="connectionString" 
         Value="[CONNECTION_STRING]Data Source=[DBSERVER];Initial Catalog=[DBNAME];Integrated Security=True;MultipleActiveResultSets=True&quot;" 
         SelectionLanguage="XPath" 
         Sequence="5"/> 

      <!--<authentication mode="Forms">--> 
      <util:XmlFile Id="AuthenticationModeWindows" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/authentication" 
         Name="mode" 
         Value="Windows" 
         Sequence="6" /> 

      <!--Switch off debug--> 
      <util:XmlConfig Sequence="7" 
          Id="SwitchOffDebug" 
          File="[INSTALLLOCATION]\web.config" 
          Action="create" On="install" 
          Node="value" 
          ElementPath="/configuration/system.web/compilation" 
          Name="debug" 
          Value="false" /> 


      <!--Session configuration <sessionState mode="InProc" timeout="15" />--> 
      <util:XmlFile Id="system.websessionState" 
         File="[INSTALLLOCATION]Web.config" 
         Action="createElement" 
         ElementPath="/configuration/system.web" 
         Name="sessionState" 
         Sequence="8" /> 

      <util:XmlFile Id="system.websessionStateAttribute" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/sessionState" 
         Name="mode" Value="InProc" 
         Sequence="9" /> 

      <util:XmlFile Id="system.websessionStateAttribute2" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/sessionState" 
         Name="timeout" 
         Value="15" 
         Sequence="10" /> 

      <util:XmlFile Id="system.websessionStateAttribute3" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/sessionState" 
         Name="cookieName" 
         Value="[VIRTUALDIRECTORYVALUE]" 
         Sequence="11" /> 
     </Component> 

<iis:WebSite Id='DefaultWebSite' 
      Description='Default Web Site' 
      Directory='INSTALLLOCATION' SiteId ='[WEBSITEVALUE]' > 

    <iis:WebAddress Id="AllUnassigned" Port="80" /> 
</iis:WebSite> 
<iis:WebAppPool Id="AppPool" Name="[APPPOOLVALUE]" /> 

<CustomAction Id="MapVirtualDirectory" Directory="INSTALLLOCATION" Return="asyncNoWait" 
       ExeCommand='[ASPNETREGIIS] -norestart -s "W3SVC/[WEBSITEVALUE]/ROOT/[VIRTUALDIRECTORYVALUE]"' /> 

<InstallExecuteSequence> 
    <Custom Action="MapVirtualDirectory" After="InstallFinalize" >ASPNETREGIIS AND NOT Installed</Custom> 
</InstallExecuteSequence> 

<CustomAction Id="GetIISWebSites" BinaryKey="IisManager" DllEntry="GetWebSites" Execute="immediate" Return="check" /> 
<CustomAction Id="GetIISAppPools" BinaryKey="IisManager" DllEntry="GetAppPools" Execute="immediate" Return="check" /> 

<InstallUISequence> 
    <Custom Action="GetIISWebSites" After="CostFinalize" Overridable="yes">NOT Installed</Custom> 
    <Custom Action="GetIISAppPools" After="CostFinalize" Overridable="yes">NOT Installed</Custom> 
</InstallUISequence> 

<Feature Id='ApplicationFeatures' Title="!(loc.ProductName)" Level='1'> 
    <ComponentRef Id='WebVirtualDirComponent' /> 
    <ComponentGroupRef Id="MyWebApp_Project" /> 
    <ComponentRef Id="Web.config" /> 

</Feature> 

<!-- Specify UI --> 
<Property Id="WIXUI_INSTALLDIR">INSTALLLOCATION</Property> 
<UIRef Id="MyCustomUI"/> 

Oto mój plik lokalizacja:

<?xml version="1.0" encoding="utf-8"?> 
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization"> 

    <!--application settings--> 
    <String Id="LANG">1033</String> 
    <String Id="ProductName">MyTestWebSite</String> 
    <String Id="ProductVersion">1.0.0.0</String> 
    <String Id="CompanyName">MyCompanyName</String> 
    <String Id="DefaultDocument">Default.aspx</String> 
    <String Id="WebApplicationProjectName">MyWebApp</String> 


    <!--database settings--> 
    <String Id="EntityName">MyEntities</String> 
    <String Id="ModelName">MyModel</String> 

</WixLocalization> 
+1

Necro, ale ... lepiej jest zastąpić swoje prawdziwe GUID-y za pomocą "PUT-GUID-HERE" w przykładach. – Izzy

+1

Dzięki za wskazówkę Izzy – Alicia

2

XmlFile i XmlConfig oba piszą atrybuty na poziomie atomowym. Aby uzyskać pożądane zachowanie, należy napisać natychmiastową akcję niestandardową, aby odczytać plik XML i zapisać wynik w postaci Property. Następnie zmodyfikuj to, co chcesz (możesz to zrobić w niestandardowej akcji, jeśli manipulacja jest złożona), a następnie zmień z powrotem całą manipulowaną wartość.

Ta metoda wymaga najmniej skomplikowanego zestawu niestandardowych działań w kodzie, umożliwiając XmlFile i XmlConfig wykonanie operacji podnoszenia ciężkiego i wycofywania uchwytów i wszystkich tych rzeczy. Po prostu dokonaj modyfikacji w idempotencie Property.

Powodzenia!

+0

Dzięki Rob.I obecnie nie dodawaj mojego web.config poprzez proces msbuild i dodawaj go osobno przez komponent w moim product.wsx. Powodem tego jest, jak również manipulowanie ustawieniami connectionstring, mam również kilka innych Alicia

+0

Tak, na koniec musisz podać wynik do 'Property' lub serii właściwości, które rozwiązują do linii w' XmlFile'. Jestem pewien, że jest to wykonalne, diabeł tkwi w szczegółach. :) –

Powiązane problemy