Làm cách nào để sử dụng Web.debug.config trong máy chủ gỡ lỗi studio trực quan được tích hợp sẵn?


Câu trả lời:


92

Đây là một lỗi đã biết. Tính năng đó chỉ có thể được sử dụng ngay bây giờ như một phần của quá trình triển khai.

https://connect.microsoft.com/VisualStudio/feedback/details/523221/have-web-debug-config-apply-during-development

Hãy ủng hộ nó, nếu bạn cũng gặp phải điều này, vì vậy điều này sẽ được khắc phục càng sớm càng tốt.


16
Đối với hồ sơ, đây không phải là một lỗi, nó là do thiết kế. Các tệp này dành cho gói / xuất bản. Nhưng điều đó sẽ không làm nản lòng bất cứ ai bình chọn mục đó.
Sayed Ibrahim Hashimi

26
Đối với tôi thì đó là một lỗi, nếu không thì mục đích của chuyển đổi Gỡ lỗi / Phát hành trên máy chủ định vị là gì? Đôi khi thiết kế là sai lầm, điều đó không có nghĩa là nó là đúng :)
Lord of Scripts

4
Vấn đề xảy ra khi bạn sử dụng Github và cần bỏ qua web.config khi đồng bộ hóa. Nhưng điều đó đánh bại mục đích của việc sao lưu - ý tôi là đó là lý do tại sao tôi sử dụng Github. Bây giờ thêm AppHarbor vào kịch bản và bạn phải hỗ trợ hai loại tệp web.config, vì bạn muốn apikeys của mình được xuất bản trên Github, vì vậy bạn phải thay thế các giá trị trong cấu hình của mình trước khi đồng bộ hóa và xuất bản. Đó là một vấn đề. Quên thay thế các giá trị của bạn trong cấu hình và đồng bộ hóa do nhầm lẫn, và đoán xem? Apikeys của bạn vừa được tạo thành một kho lưu trữ công khai. Rất tiếc, thật là một vấn đề.
David Robbins

8
Liên kết đến MS Connect bị hỏng
Michael Freidgeim

17
@LordofScripts: khi một lỗi được đóng lại "như thiết kế", đôi khi tôi muốn nói "thì có một lỗi trong thiết kế của bạn!"
Roy Tinker

34

Điều này thực sự khá đơn giản để làm và, tin hay không, có vẻ như đây là cách VS được thiết kế để hoạt động.

Thêm nguyên văn các dòng sau ngay trước thẻ đóng "Dự án" của tệp .csproj của dự án có chứa 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>

Đặt các dòng sau nguyên văn sự kiện sau xây dựng trong thuộc tính dự án của dự án có chứa tệp web.config. Thực hiện việc này cho mỗi cấu hình bản dựng mà bạn muốn các phép biến đổi chạy.

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU
xcopy "$(ProjectDir)obj\$(ConfigurationName)\Web.Config" "$(ProjectDir)". /F /R /Y

1
Tôi chỉ khuyên bạn nên thêm dấu ngoặc kép xung quanh $ (ProjectDir) và $ (ProjectPath) để tránh lỗi trong trường hợp đường dẫn dự án của bạn chứa khoảng trắng.
Alexander Prokofyev

1
Nó tốt hơn để sử dụng <Target Name = "BeforeBuild">, vì nó đã được đề xuất trong stackoverflow.com/a/10506476/52277
Michael Freidgeim

Tôi có thể làm cho các chuyển đổi hoạt động bằng cách sử dụng phương pháp này nhưng tôi không thể đạt được các điểm dừng của mình. Tôi đã đặt gỡ lỗi thành true nhưng tôi chưa bao giờ đạt được điểm ngắt và tôi nhận được thông báo sau "Điểm ngắt hiện sẽ không được nhấn. Không có ký hiệu nào được tải cho tài liệu này.". Điều này chỉ xảy ra đối với cấu hình tùy chỉnh của tôi và hoạt động tốt nếu tôi đặt cấu hình của mình thành "Gỡ lỗi". Có ý kiến ​​gì không?
mithun_daa

1
Tôi đã phải thêm dấu ngoặc kép xung quanh $ (MSBUILDBINPATH) để làm cho nó hoạt động, nếu không nó sẽ thoát với mã 9009
sotn

6
Lưu ý rằng điều này thay thế bản gốc Web.config, vì vậy tất cả các phép biến đổi của bạn phải là "idempotent" (có thể được áp dụng lại trên kết quả của bất kỳ phép biến đổi nào khác). Nó cũng sẽ khiến bạn không giữ được sự tỉnh táo nếu bạn đặt tệp ở chế độ kiểm soát nguồn (như bạn có thể nên làm). Nhìn chung, một bản hack "đơn giản" giúp chuyển sự phức tạp / đau đớn sang một loạt vấn đề tiếp theo. Tốt nếu bạn có thể giải quyết nó "tốt hơn" ở đó, tệ nếu bạn không. Cũng nên xem xét sử dụng $ (VisualStudioVersion) thay vì mã hóa cứng phiên bản VS (bạn sẽ quên thay đổi nó).
tne

16

Tôi đã giải quyết vấn đề này theo cách đơn giản hơn, bằng cách thêm nó vào cuối tệp .csproj, ngay trước thẻ. Điều này tương tự như câu trả lời của keitn, với sự khác biệt là nó không sử dụng sự kiện xây dựng bài đăng.

<Target Name="BeforeBuild">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>

3
Đã xác nhận, nó hoạt động. Nhưng hãy cẩn thận, nó sửa đổi bản sao cục bộ của Web.config. Vì vậy, nếu bạn đang sử dụng các biến đổi XSLT như RemoveAttributes, nó chắc chắn bị loại bỏ! Hoạt động tốt với SetAttributes
Loul G.

Điều này đã làm chính xác những gì tôi đang tìm kiếm. Đơn giản và đi thẳng vào vấn đề. Không chắc tại sao tất cả các giải pháp khác phải rất ... phức tạp.
David Carrigan

Có ai biết cách hoàn tác hành động này trong phần <Target name = "AfterBuild"> không?
Cameron Belt

1
Đây nên là câu trả lời.
Cameron Belt

2

Tôi không muốn cập nhật web.config trong dự án của mình chỉ là cái kết thúc trong thư mục bin nên đây là cách tôi đã thực hiện.

Thêm phần sau vào cuối .csproj (ngay trước thẻ đóng dự án cuối cùng)

<Target Name="Transform">
    <MakeDir Directories="bin" Condition="!Exists('bin')" />
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
  </Target>

Sau đó thêm bước xây dựng bài đăng sau

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU

Điều này có nghĩa là khi bạn xây dựng một chuyển đổi sẽ diễn ra từ cấu hình gỡ lỗi / phát hành thành tệp WebsiteName.Config trong thư mục bin đầu ra do đó không can thiệp vào web.config chính trong dự án.


2
Điều này thực hiện chuyển đổi cấu hình trong thư mục bin, tiếc là cấu hình này không bao giờ được sử dụng. Cấu hình được tải thực sự là Web.Config trong thư mục dự án, không phải là cấu hình trong thư mục bin.
Mick

2

Sau khi đọc nhiều bài đăng tương tự và gặp sự cố tệp không thể ghi đè hoặc không thể truy cập web.config vì chỉ đọc được, đây là những gì tôi đã làm việc cho mình:

  <Target Name="BeforeBuild" Condition="$(Configuration) == 'MyAltDebugConfiguration'">
    <ItemGroup>
      <OriginalWebConfig Include="$(ProjectDir)Web.config"/>
      <TempWebConfig Include="$(ProjectDir)TempWeb.config"/>
    </ItemGroup>
    <Exec Command="&quot;$(DevEnvDir)tf.exe&quot; checkout &quot;$(ProjectDir)Web.config&quot;" />
    <Copy SourceFiles="@(OriginalWebConfig)" DestinationFiles="@(TempWebConfig)" />
    <TransformXml Source="$(ProjectDir)TempWeb.config"
                            Transform="Web.$(Configuration).config"
                            Destination="Web.config" />
  </Target>

Ghi chú:

Điều này chạy dưới dạng mục tiêu BeforeBuild.

Tôi chỉ muốn nó chạy dưới một cấu hình nhất định (một môi trường gỡ lỗi thay thế) và đó là lý do tại sao tôi có Điều kiện. Khi triển khai qua web, hãy triển khai mục tiêu xuất bản và tôi không cần mục tiêu này để chạy.

Tôi không muốn phải nhớ kiểm tra web.config (chỉ hoàn tác khi tôi hoàn tất) vì vậy tôi kiểm tra web.config trước khi bắt đầu chuyển đổi. Nếu bạn không sử dụng TFS, bạn có thể xóa dòng này.

Vì VS (2010) \ msbuild không muốn loại bỏ Nguồn web.config, tôi sử dụng một tệp tạm thời (nhờ bài viết này để biết thông tin: http://www.diaryofaninja.com/blog/2011/09/ 14 / using-custom-webconfig-transformations-in-msbuild )

Tôi đã thử thêm một lệnh để xóa TempWeb.config nhưng VS \ msbuild không muốn loại bỏ nó. Tôi có thể sống với nó vì nó không được thêm vào TFS.


Tôi có lỗi này 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. Có ý kiến ​​gì không?
sky91

1

Tôi biết điều này đã cũ, nhưng tôi đang đối mặt với vấn đề tương tự. Chúng tôi có các cấu hình Test, Staging, Live thay thế điểm cuối, chuỗi kết nối, v.v. từ Web.config mặc định

Tuy nhiên, tôi sẽ làm như sau:

  • Nhấp chuột phải vào cấu hình chuyển đổi mong muốn (ví dụ: Web.Live.config )
  • Nhấp vào "Xem trước Chuyển đổi"
  • Sao chép mọi thứ từ bên phải (đó là giao diện của Web.config với sự chuyển đổi)
    • CTRL + A + CTRL + C
  • Mở tệp Web.config (tệp mặc định)
  • Chọn mọi thứ (CTRL + A) và dán nó vào (CTRL + V)
  • Chạy

Nó không có nhiều bước và được thực hiện khá nhanh chóng khi bạn hiểu rõ. Hi vọng điêu nay co ich. :)


Nếu tôi hiểu đúng thì đây là một thay đổi phá hoại đối với tệp web.config gốc. Trong ngữ cảnh của câu hỏi, các bước này sẽ cần được thực hiện mỗi khi bắt đầu phiên gỡ lỗi.
Red Taz

-1

@ologesa: Giải pháp của bạn cần quyền truy cập ghi vào Web.config gốc (bạn phải đăng xuất trong TFS). Giải pháp tốt hơn là tạo trực tiếp Web.config trong thư mục bin như keitn làm điều này. Khi chúng tôi kết hợp keitn's và giải pháp của bạn, chúng tôi nhận được giải pháp này:

<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>

3
Sẽ tốt nhưng như Mick nhận xét; tệp này không được sử dụng. Làm cách nào để tải ứng dụng hoặc IIS sử dụng tệp cấu hình này?
HMR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.