2010-10-13 14 views
136

Powiel możliwe:
How can I use Web.debug.config in the built-in visual studio debugger server?Wykorzystanie Visual Studio web.config przekształcić do debugowania

chcę użyć transformacji Web.config, który działa dobrze dla publikuje także do debugowania.

Po opublikowaniu aplikacji internetowej program Visual Studio automatycznie przekształca plik Web.config na podstawie konfiguracji mojego currenctbuild. Jak mogę poinformować program Visual Studio, aby zrobił to samo po uruchomieniu debugowania? Po uruchomieniu debugowania po prostu używa domyślnego pliku Web.config bez transformacji.

Każdy pomysł?

+13

To pytanie jest * nie * duplikatem. Połączony "duplikat" http://stackoverflow.com/questions/3305096/how-can-i-use-web-debug-config-in-upocket-in-visual-studio-debugger-server odnosi się do konkretnego wersja Visual Studio. To pytanie nie jest, i moim zdaniem to pytanie ma i tak więcej przydatnych odpowiedzi. –

Odpowiedz

17

W konfiguracji debugowania, dodać krok po kompilacji i używać go zastąpić/przekształcić swoje web.config

+0

Jeśli jest jakiś powód, dla którego nie możesz zrobić tego, co sugeruje moja odpowiedź, jest to najlepsza opcja, jak sądzę. Myślę, że zadania przed/po budowaniu są czasami pomijane! –

+0

Ponieważ oznacza to, że będziesz nadpisywać oryginalny "web.config", upewnij się, że nie tracisz na stałe ustawień, których będziesz potrzebować. Bądź świadom tego, co tak naprawdę robi. Każda trwała transformacja, którą twój 'web.Debug.config' robi z twoim' web.config', będziesz musiał upewnić się, że twój plik 'web.Release.config' naprawi to wszystko. –

+1

Powiązany artykuł: https://gist.github.com/EdCharbeneau/9135216 – Suamere

28

Można po prostu użyć „default” web.config jako wersja rozwojowa/debugowania, a następnie web.release.config będzie oczywiście nadal wersją wydania, ponieważ transformacje są stosowane podczas publikowania.

+39

To nie zawsze działa dobrze w środowiskach wielu programistów (np. Ciąg połączenia myśl). –

+3

V. podobny do punktu Bena ... jak o wielu środowiskach programistycznych, używam trzech różnych komputerów Dev, do testowania różnych przeglądarek itp., Ciągle trzeba zmieniać różne konfiguracje, aby celować w różne te różne konfiguracje. – MemeDeveloper

+4

Czasami potrzebuję debugowania przeciwko naszej integracji lub tymczasowej bazy danych zamiast zwykłej bazy danych programistycznych. Bardzo pomocne byłoby zastosowanie odpowiedniej transformacji podczas uruchamiania debuggera VS. – Zarepheth

13

Chociaż zgadzam się, że najprostsze podejście jest zwykle najlepsze, mogę łatwo wyobrazić sobie sytuację, w której przez pewien okres czasu chcesz połączyć swoje IDE z bazą danych testowych zamiast z bazą danych programowania. Chociaż możesz określić ciągi połączenia programisty w domyślnym pliku web.config, byłoby naprawdę miło mieć plik Web.Test.config, więc gdy zamienisz konfigurację kompilacji na "Test", automatycznie uzyskasz nowe ustawienia podczas gdy jesteś w swoim IDE.

Historyczna alternatywa polega na skomentowaniu jednego zestawu ciągów połączeń dla drugiego, ale te nowe przekształcenia konfiguracji dają nadzieję na ostateczne umieszczenie stawki w sercu tej brzydkiej praktyki. Mimo że jeden domyślny plik do opracowania i transformacja do wydania może działać przez długi czas, dodanie bardziej szczegółowej odpowiedzi do pliku web.config jest, moim zdaniem, bardziej kompletną odpowiedzią.

+4

jaka jest składnia zdarzenia post-build do przetwarzania w sieci config? – Cutter

+0

Można użyć poleceń, na przykład do skopiowania osobnego pliku; jednym ze sposobów debugowania/testowania i innym sposobem produkcji (aby upewnić się, że twoja kompilacja publikacji nie otrzyma informacji o próbie). –

+0

Zgadzam się. Podczas debugowania projektu w chmurze konfiguracja działa w ten sposób. Byłoby miło z pewną konsekwencją, jak na przykład config-transform dla bibliotek klas itp. –

31

Andrew jest na dobrej drodze. Gdy korzystasz z tej funkcji, to w jaki sposób został zaprojektowany do użycia.

web.config To jest plik konfiguracyjny, który programiści powinni używać lokalnie. Idealnie powinieneś to zestandaryzować. Na przykład można użyć localhost dla ciągów DB, a co nie. Powinieneś dążyć do tego, aby to działało na komputerach bez zmian.

web.debug.config Jest to transformacja stosowana podczas publikowania aplikacji w środowisku pomostowym programisty. Wprowadziłoby to zmiany w pliku web.config, które są wymagane w środowisku docelowym.

web.release.config Jest to transformacja stosowana podczas publikowania aplikacji w środowisku "produkcyjnym". Oczywiście musisz być ostrożny z hasłami w zależności od aplikacji/zespołu.

Problem z przekształceniem aktualnie używanego pliku web.config polega na tym, że transformacja może wykonywać akcje destrukcyjne w pliku web.config. Na przykład może usunąć atrybuty, usunąć elementy itp.

+4

Przełączanie między trybem wydania i debugowania zawsze miało wpływ na uruchamianie aplikacji lokalnie. Jeśli 1), aby transformacja była wyjątkiem od reguły, czyni to przeciwieństwo intuicyjnym, – AaronLS

+11

To, co mówisz, jest poprawne, ale moim zdaniem konstrukcja tej funkcji jest ograniczona. wystandaryzowany web.config dla wszystkich programistów, we wszystkich środowiskach, w dowolnym zespole wielkości może nie być możliwe (dla niczego oprócz najprostszych przypadków). Brak wsparcia dla tej funkcji dla lokalnych wersji jest moim zdaniem wielkim wstydem. – MemeDeveloper

+3

Ponadto, dlaczego istnieje problem z destrukcyjną naturą transformacji ... web.config i transformacje powinny być w SC. Każde środowisko wymagające innej konfiguracji powinno mieć własną transformację, np. web.config, web.devgroup1.config, web.devgroup2.config, web.staging.config web.production.config itd. Tak więc chociaż web.config ulegnie zmianie, nic nie zostanie utracone, a otrzymanie najnowszego + kompilacji da wynik poprawny web.config dla tego środowiska, nic nie stracił. – MemeDeveloper

86

OK, przy założeniu, że web.debug.config & web.release.config dotyczy tylko pakietu/publikacji. Wymyśliłem sposób, aby umożliwić to, co próbujesz zrobić. Blogowałem o tym pod adresem http://sedodream.com/2010/10/21/ASPNETWebProjectsWebdebugconfigWebreleaseconfig.aspx. Oto podsumowanie.

Zobaczmy teraz, jak możemy włączyć to, co pytający pytający chce zrobić.

Podsumowując, kiedy tworzy konkretną konfigurację, chce zastosować konkretną transformację do web.config. Więc oczywiście nie chcesz zachować pliku web.config, ponieważ zostanie on nadpisany.

Musimy zatem utworzyć nowy plik web.template.config, który jest tylko kopią web.config. Następnie po prostu usuń web.config za pomocą Eksploratora Windows (nie usuwaj przy użyciu Visual Studio, ponieważ nie chcemy go usuwać z projektu).

Uwaga: Jeśli korzystasz z dostawcy kontroli kodu źródłowego zintegrowanego z programem Visual Studio, prawdopodobnie zechcesz usunąć plik web.config ze sterowania źródłowego.

Również z tym nie chcemy korzystać z web.debug.config lub web.release.config, ponieważ mają one już dobrze określoną rolę w gazecie publikowania w Internecie, więc nie chcemy tego przeszkadzać. Dlatego utworzymy dwa nowe pliki w tym samym folderze co projekt i web.template.config, web.dev.debug.config i web.dev.release.config.

Chodzi o to, że będą to transformacje stosowane podczas debugowania lub uruchamiania aplikacji z Visual Studio. Teraz musimy podłączyć się do procesu budowania/pakietowania/publikowania, aby uzyskać to wszystko połączone. W przypadku projektów aplikacji WWW (WAP) istnieje punkt rozszerzenia, w którym można utworzyć plik projektu w tym samym folderze o nazwie {ProjectName}.wpp.targets, gdzie {ProjectName} jest nazwą projektu. Jeśli ten plik znajduje się na dysku w tym samym folderze co WAP, zostanie automatycznie zaimportowany do pliku projektu. Więc stworzyłem ten plik. I umieściłem następującą treść:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <!-- Make sure web.config will be there even for package/publish --> 
    <Target Name="CopyWebTemplateConfig" BeforeTargets="Build"> 
    <Copy SourceFiles="web.template.config" 
      DestinationFiles="web.config"/> 
    </Target> 

    <PropertyGroup> 
    <PrepareForRunDependsOn> 
     $(PrepareForRunDependsOn); 
     UpdateWebConfigBeforeRun; 
    </PrepareForRunDependsOn> 
    </PropertyGroup> 

    <!-- This target will run right before you run your app in Visual Studio --> 
    <Target Name="UpdateWebConfigBeforeRun"> 
    <Message Text="Configuration: $(Configuration): web.dev.$(Configuration).config"/> 
    <TransformXml Source="web.template.config" 
       Transform="web.dev.$(Configuration).config" 
       Destination="web.config" /> 
    </Target> 

    <!-- Exclude the config template files from the created package --> 
    <Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage"> 
    <ItemGroup> 
     <ExcludeFromPackageFiles Include="web.template.config;web.dev.*.config"/> 
    </ItemGroup> 
    <Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/> 
    </Target> 
</Project> 

Pozwól mi to wyjaśnić. Stworzyłem obiekt CopyWebTemplateConfig, który zawsze kopiuje web.template.config do web.config na kompilacji, nawet jeśli nie debugujesz aplikacji w Visual Studio.

Jest to konieczne, ponieważ wciąż musimy wspierać proces pakowania/publikowania w Visual Studio. Następnie rozszerzyłem właściwość PrepareForRunDependsOn, aby objąć cel o wartości UpdateWebConfigBeforeRun. Ta właściwość służy do identyfikowania listy celów, które muszą zostać wykonane, zanim dowolny zarządzany projekt zostanie uruchomiony z programu Visual Studio.

W tym celu używam zadania TransformXml do transformacji web.template.config, używając poprawnego pliku web.dev.***.config. Następnie aplikacja uruchamia się przy użyciu poprawnej web.config w oparciu o konfigurację kompilacji. Po tym mam kolejny cel ExcludeCustomConfigTransformsFiles, który wprowadzam do procesu pakowania/publikowania za pomocą atrybutu BeforeTargets=”ExcludeFilesFromPackage”. Jest to potrzebne, ponieważ nie chcemy, aby te pliki były dołączane, gdy aplikacja jest pakowana lub publikowana. Więc to naprawdę wszystko.

Aby wyjaśnić proces pakowania/publikowania nieco więcej w tym scenariuszu.Podczas pakowania/publikowania web.debug.config lub web.release.config, w zależności od konfiguracji kompilacji, nadal będzie używany. Ale ostatecznie plik, który się transformuje to web.template.config, więc być może będziesz musiał dostosować w zależności od tego, co masz w tym pliku. Pytania/komentarze?

+0

Postępowałem zgodnie z instrukcjami tutaj, ale wygląda na to, że nie działa, chyba że skopiuję dokładną konfigurację, której potrzebuję (sans transform rzeczy) do web.template.config. Wszelkie pomysły, dlaczego tak się dzieje (lub jak zweryfikować, które z moich plików konfiguracyjnych web.dev. *.) Jest używane do transformacji? –

+1

Mike, miałem ten sam problem, ale gdy usunąłem działa tak, jak potrzebowałem" –

+0

Próbowałem używać tego w sposób opisany, ale nadal nie działa. Dziwne, że używamy tego w innych projektach i działa bez problemu. to pytanie o stos: http://stackoverflow.com/questions/11763841/web-config-transform-from-web-template-xml-not-working, jeśli ktoś chce dzwonić. – Jerry

Powiązane problemy