Jak mogę scalić i używać Web.debug.config
wbudowanego debugera programu Visual Studio 2010?
Jak mogę scalić i używać Web.debug.config
wbudowanego debugera programu Visual Studio 2010?
Odpowiedzi:
To znany błąd. Ta funkcja może być teraz używana tylko jako część procesu wdrażania.
Proszę, zagłosuj za tym, jeśli to również napotkasz, więc zostanie to naprawione jak najszybciej.
Jest to całkiem proste i wierz lub nie, wydaje się, że właśnie w ten sposób ma działać VS.
Dodaj następujące wiersze dosłownie bezpośrednio przed zamykającym tagiem „Project” pliku .csproj projektu zawierającego web.config.
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="Transform">
<MakeDir Directories="obj\$(Configuration)" Condition="!Exists('obj\$(Configuration)')" />
<TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="obj\$(Configuration)\Web.config" StackTrace="true" />
</Target>
Umieść następujące wiersze dosłownie w zdarzeniu po kompilacji we właściwościach projektu, który zawiera plik web.config. Zrób to dla każdej konfiguracji kompilacji, dla której chcesz przeprowadzić transformacje.
"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU
xcopy "$(ProjectDir)obj\$(ConfigurationName)\Web.Config" "$(ProjectDir)". /F /R /Y
Web.config
, więc wszystkie twoje transformacje muszą być „idempotentne” (można je ponownie zastosować na wynikach innych transformacji). Uniemożliwi to również zachowanie rozsądku, jeśli umieścisz plik w kontroli źródła (tak jak prawdopodobnie powinieneś). Ogólnie rzecz biorąc, „prosty” hack, który przenosi złożoność / ból na kolejny zestaw problemów. Dobrze, jeśli możesz sobie z tym poradzić „lepiej” tam, źle, jeśli nie. Również rozważyć użycie $ (VisualStudioVersion) zamiast twarde kodowania wersji VS (trzeba będzie zapomnieć, aby go zmienić).
Rozwiązałem to w prostszy sposób, dodając to na końcu pliku .csproj, tuż przed tagiem. Jest to podobne do odpowiedzi Keitn, z tą różnicą, że nie używa zdarzenia po kompilacji.
<Target Name="BeforeBuild">
<TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
Nie chciałem aktualizować pliku web.config w moim projekcie tylko ten, który trafia do folderu bin, więc oto jak to zrobiłem.
Dodaj następujący kod na końcu .csproj (tuż przed ostatnim znacznikiem zamykającym projektu)
<Target Name="Transform">
<MakeDir Directories="bin" Condition="!Exists('bin')" />
<TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
</Target>
Następnie dodaj następujący krok po kompilacji
"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU
Oznacza to, że podczas budowania transformacja odbywa się z pliku debug / release config do pliku WebsiteName.Config w wyjściowym katalogu bin, a zatem nie koliduje z głównym web.config w projekcie.
Po przeczytaniu wielu podobnych postów i problemach z plikami, których nie można nadpisać lub nie można uzyskać dostępu do pliku web.config, ponieważ jest on tylko do odczytu, oto co pracowało dla mnie:
<Target Name="BeforeBuild" Condition="$(Configuration) == 'MyAltDebugConfiguration'">
<ItemGroup>
<OriginalWebConfig Include="$(ProjectDir)Web.config"/>
<TempWebConfig Include="$(ProjectDir)TempWeb.config"/>
</ItemGroup>
<Exec Command=""$(DevEnvDir)tf.exe" checkout "$(ProjectDir)Web.config"" />
<Copy SourceFiles="@(OriginalWebConfig)" DestinationFiles="@(TempWebConfig)" />
<TransformXml Source="$(ProjectDir)TempWeb.config"
Transform="Web.$(Configuration).config"
Destination="Web.config" />
</Target>
Uwagi:
Działa jako cel BeforeBuild.
Chcę, aby działał tylko w określonej konfiguracji (alternatywnym środowisku debugowania) i dlatego mam parametr Condition. Podczas wdrażania za pośrednictwem sieci Web cel publikacji włącza się i nie potrzebuję tego celu do działania.
Nie chcę pamiętać o sprawdzeniu pliku web.config (tylko po to, aby go cofnąć, gdy skończę), więc sprawdzam web.config przed rozpoczęciem transformacji. Jeśli nie używasz TFS, możesz usunąć ten wiersz.
Ponieważ VS (2010) \ msbuild nie chce puścić źródła web.config, używam pliku tymczasowego (dzięki temu artykułowi za informacje: http://www.diaryofaninja.com/blog/2011/09/ 14 / using-custom-webconfig-transformations-in-msbuild )
Próbowałem dodać polecenie usunięcia TempWeb.config, ale VS \ msbuild nie chce go puścić. Mogę z tym żyć, ponieważ nie jest dodawany do TFS.
The command ""C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\tf.exe" checkout "C:\_Code\RTS\SCTimeSheet\Web.config"" exited with code 9009
. Jakieś pomysły?
Wiem, że to jest stare, ale mam ten sam problem. Mamy konfiguracje Test, Staging, Live, które zastępują punkty końcowe, parametry połączenia itp. Z domyślnego pliku Web.config
Jednak zrobiłbym następujące rzeczy:
To nie jest tak wiele kroków i jest to zrobione dość szybko, gdy już to zrozumiesz. Mam nadzieję że to pomoże. :)
@ologesa: Twoje rozwiązanie wymaga dostępu do zapisu w oryginalnym pliku Web.config (musisz wyewidencjonować w programie TFS). Lepszym rozwiązaniem jest bezpośrednie wygenerowanie pliku Web.config w folderze bin, tak jak robi to keitn. Kiedy połączymy Keitn i Twoje rozwiązanie, otrzymamy to:
<Target Name="BeforeBuild">
<Message Text="Transforming Web.config from Web.$(Configuration).config" Importance="high" />
<MakeDir Directories="bin" Condition="!Exists('bin')" />
<TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
</Target>