2011-12-22 12 views
5

Używam Wix 3.6 beta z wiersza poleceń, a nie projektów VS. Mam aplikację internetową, która jest zbierana za pomocą ciepła jako katalogu. To działa. Korzystam z transformacji web.config w celu zarządzania każdym plikiem web.config środowiska docelowego. Są one wyprowadzane z msbuild, to działa i utrzymuje rzeczy widoczne w Visual Studio i kontroli źródła.Korzystanie z Wix, jak mogę wdrożyć jeden z kilku plików web.config podczas instalowania aplikacji internetowej ASP.net

Wystąpił problem z wdrożeniem jednego z kilku plików web.config, które ręcznie wprowadzam do pliku product.wxs jako składniki z warunkami. Spodziewałem się, że wszystkie komponenty będą dostępne jako funkcje, które można rozmieścić, i niech warunki będą wybrane jako aktywne. Na przykład:

 <DirectoryRef Id="wwwroot"> 
     <Component Id="setup_a" Guid="some_guid" > 
      <File Source="$(var.ConfigSourceDir)\setup_a\web.config" /> 
      <Condition>ENVIRON = setup_a</Condition> 
     </Component> 

     <Component Id="setup_b" Guid="some_guid" > 
      <File Source="$(var.ConfigSourceDir)\setup_b\web.config" /> 
      <Condition>ENVIRON = setup_b</Condition> 
     </Component> 

ta nie tworzy żadnego pliku zmiana nazwy, przenoszenie lub usuwanie problemów, ale ma bardzo zasadniczy problem, że wiele plików web.config są przypisane do tego samego celu, a to daje mi lekki błąd "Product.wxs (xxx): error LGHT0091: Znaleziono duplikat symbolu" File: web.config ", co zwykle oznacza, że ​​identyfikator jest duplikowany. Sprawdź, czy wszystkie identyfikatory danego typu (plik, komponent, funkcja) są wyjątkowe. "

Alternatywnym rozwiązaniem było wykorzystanie różnych nazwach plików .config i zmienić nazwę/przenieść jeden się web.config, więc coś takiego:

 <DirectoryRef Id="wwwroot"> 
       <Component Id="setup_a" Guid="some_guid" > 
       <File Id="setup_a.config" Source="$(var.ConfigSourceDir)\setup_a.config" /> 
       <CopyFile Id="moveit" SourceDirectory="wwwroot" SourceName="setup_a.config" DestinationDirectory="wwwroot" DestinationName="web.config" /> 
       </Component> 

nie wygeneruje błąd, bot na CopyFile polecenie nic nie robi. Właśnie dostaję setup_a.config w folderze wwwroot.

Gdybym zagnieździć CopyFile wewnątrz pliku, akcja kopia następnie działa:

 <DirectoryRef Id="wwwroot"> 
       <Component Id="setup_a" Guid="some_guid" > 
       <File Id="setup_a.config" Source="$(var.ConfigSourceDir)\setup_a.config" > 
        <CopyFile Id="moveit" DestinationName="web.config"/> 
       </File> 
       </Component> 

... ale zagnieżdżone CopyFile oznacza, że ​​nie można dodać (nie jest to zabronione) = Usuń atrybut „tak” stwórz akcję "ruchu". Zamiast tego mam plik setup_a.config i web.config w folderze wwwroot. Alternatywnie, jeśli dodać removefile oddzielna ramach tego samego elementu składnika też nic nie robi:

<RemoveFile Id="removefile" On="install" Directory="wwwroot" Name="setup_a.config"/> 
</Component> 

Więc mam nadzieję na przykład pracy, jak obsługiwać wiele plików web.config w ramach warunkowego rozmieszczenia to nie pozostawia plików za sobą. docelowa nazwa pliku web.config jest naprawiana przez framework i nie można jej zmienić. Różne konfiguracje są również generowane poza wix za pomocą transformacji konfiguracji, nie można tego zmienić, ale wygenerowane nazwy plików mogą być dowolne.

Pozdrawiam!

Odpowiedz

7

Komplikujesz to zbyt mocno. To powinno działać:

<Component Id="setup_a" Guid="some_guid" > 
     <File Name="web.config" Id="config_a" Source="$(var.ConfigSourceDir)\setup_a\web.config" /> 
     <Condition>ENVIRON = setup_a</Condition> 
    </Component> 

    <Component Id="setup_b" Guid="some_guid" > 
     <File Name="web.config" Id="config_b" Source="$(var.ConfigSourceDir)\setup_b\web.config" /> 
     <Condition>ENVIRON = setup_b</Condition> 
    </Component> 

zwrócić uwagę na kilka rzeczy tutaj:

  • pliku/@ nazwa jest taka sama - to nazwa pliku docelowego chcesz mieć (www.config)
  • pliku/@ id jest inna dla każdego pliku w celu uniknięcia błędu światła, wspomniany pierwszy
  • pliku/@ źródłowy może być cokolwiek - po prostu opisuje, co plik wziąć jako źródło

W tym przykładzie światło nadal będzie narzekać z ostrzeżeniem LGHT1076, ale to tylko ostrzeżenie - zwraca uwagę, że warunki MUSZĄ wzajemnie się wykluczać, aby uniknąć problemów.

+0

Ahhhh brak atrybutu nazwy zepsuł moje elementy plików, dzięki czemu myślę, że to nie zadziała. Twój przykład zadziałał, dzięki Yan. –

+1

Robię to trochę czystsze (unikaj ostrzeżeń o sprawdzaniu poprawności ICE). Tworzę komponenty/pliki jako web.config-a i web.config, a następnie używam elementu CopyFile do sklonowania go do web.config. ICE ładne i czyste. Minusem jest dodatkowy plik na pudełku. Upside to plik, który daje mi wizualną wskazówkę co do wyboru i kopię dziewiczych plików na wypadek, gdyby ktoś poprawił web.config i chcę porównać/przywrócić. –

2

Zwykle przyjmuję inne podejście. Zamiast umieszczania wielu wzajemnie wykluczających się plików w instalatorze, które są ściśle powiązane z konkretnymi instancjami, umieszczam plik generyczny w instalatorze i używam zmian XML do transformacji XML z danymi punktu zmienności, takimi jak ciąg połączenia, a co nie.

To pozwala mi tworzyć instalatory, które można wdrożyć w trybie cichym, po prostu przekazując kilka właściwości i wiersz poleceń.