Cách chạy các sự kiện hậu xây dựng Visual Studio chỉ để xây dựng gỡ lỗi


592

Làm cách nào tôi có thể giới hạn các sự kiện hậu xây dựng của mình chỉ chạy cho một loại bản dựng?

Tôi đang sử dụng các sự kiện để sao chép tệp DLL vào thư mục ảo IIS cục bộ, nhưng tôi không muốn điều này xảy ra trên máy chủ xây dựng ở chế độ phát hành.

Câu trả lời:


746

Sự kiện trước và sau khi xây dựng chạy dưới dạng tập lệnh bó. Bạn có thể làm một tuyên bố có điều kiện trên $(ConfigurationName).

Ví dụ

if $(ConfigurationName) == Debug xcopy something somewhere

7
lạ, có lẽ đó chỉ là tôi nhưng tôi đã thử thêm điều kiện if và bây giờ tôi gặp lỗi này - lỗi đã thoát với mã 255
Michael L

101
Tôi đã thấy rằng toàn bộ lệnh cần phải nằm trên một dòng hoặc bạn sẽ nhận được "thoát với mã 255"
Robin Minto

7
bạn cũng có thể sử dụng gotos / nhãn cho giải pháp đầy đủ hơn (xem phần trả lời ngày 24 tháng 7 của tôi)
CestLaGalere

11
và bạn có thể sử dụng dấu ngoặc với lệnh if (xem câu trả lời của tôi để biết ví dụ)
gbjbaanb

1
Bạn nên sử dụng "xcopy / Y", để tệp sẽ được ghi đè trong thư mục đích.
Matthias

521

FYI, bạn không cần sử dụng goto. Lệnh shell IF có thể được sử dụng với dấu ngoặc tròn:

if $(ConfigurationName) == Debug (
  copy "$(TargetDir)myapp.dll" "c:\delivery\bin" /y
  copy "$(TargetDir)myapp.dll.config" "c:\delivery\bin" /y
) ELSE (
  echo "why, Microsoft, why".
)

62
Tôi cũng có thể thêm, để cẩn thận với dấu ngoặc đơn mở cần phải ngay lập tức làm theo câu lệnh if, vì nếu trên dòng tiếp theo, một mã lỗi sẽ được tạo ra
wonea

37
Sử dụng "$(ConfigurationName)"(chú ý các trích dẫn) nếu bạn nhận được mã lỗi 255
jgauffin

20
lưu ý, nếu bạn sử dụng "" khoảng $ (Tên cấu hình), bạn cũng cần các trích dẫn xung quanh từ Debug too - lệnh shell Câu lệnh IF rất .. theo nghĩa đen ... khi nói đến so sánh chuỗi.
gbjbaanb

5
Lưu ý, để thoát khỏi 255, tôi phải sử dụng "" khoảng $ (Tên cấu hình) VÀ xóa khoảng trắng xung quanh điều kiện, ví dụ: "$ (Tên cấu hình)" == "Phát hành" <- Không có khoảng trắng xung quanh ==
fhilton

15
Trong trường hợp của tôi với Visual Studio 2017 $(ConfigurationName)là trống (dòng lệnh sự kiện sau xây dựng). if "$(Configuration)" == "Debug"đã làm cho tôi. BTW, nếu bạn muốn làm một cái gì đó trong tất cả các cấu hình khác, hãy sử dụng if NOT "$(Configuration)" == "Debug".
Ralf Hundewadt

125

Thêm sự kiện xây dựng bài viết của bạn như bình thường. Sau đó lưu dự án của bạn, mở nó trong Notepad (hoặc trình soạn thảo yêu thích của bạn) và thêm điều kiện vào nhóm thuộc tính PostBuildEvent. Đây là một ví dụ:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>

5
Điều này hoạt động nhưng nó buộc bạn phải làm tất cả các công việc thiết kế của bạn cho các sự kiện trong nguồn tệp dự án. Các khai báo sự kiện xây dựng có điều kiện khác cũng được ẩn khỏi IDE.
Joseph Daigle

3
Tôi phải nói rằng đây là câu trả lời tốt hơn cho tôi, phương pháp ưa thích chỉ không hiệu quả.
Michael L

8
Bạn không cần mở nó trong Notepad, bạn có thể ở trong Visual Studio. Bạn có thể nhấp chuột phải vào tệp dự án, nhấp vào "Dỡ bỏ dự án", sau đó nhấp chuột phải lần nữa và nhấp vào "Chỉnh sửa". Bây giờ bạn có thể chỉnh sửa tệp {{csproj}} với màu cú pháp. Nhấp chuột phải một lần nữa, nhưng bây giờ bấm vào "Tải lại dự án" để tải lại.
Abel

1
Cách tiếp cận này không mở rộng các macro trong chính lệnh PostBuildEvent khi tôi thử. cd "$(ProjectDir)"mở rộng đến cd "".
Darryl

3
Trong VS 2017 bạn cũng có thể làm điều này với <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>. Biến vĩ mô và mọi thứ hoạt động như bình thường.
SC

106

Ngoài ra (vì các sự kiện được đưa vào tệp bó và sau đó được gọi), hãy sử dụng thông tin sau (trong hộp Sự kiện xây dựng, không phải trong tệp bó):

if $(ConfigurationName) == Debug goto :debug

:release
signtool.exe ....
xcopy ...

goto :exit

:debug
' Debug items in here

:exit

Bằng cách này bạn có thể có các sự kiện cho bất kỳ cấu hình, và vẫn quản lý nó với các macro thay vì phải chuyển chúng vào một tập tin thực thi, hãy nhớ rằng %1$(OutputPath)vv


6
Nếu bạn có cơ hội xem xét một số mã của mình trong bộ phản xạ, trình biên dịch sẽ chuyển đổi rất nhiều câu lệnh switch / case thành goto.
StingyJack

10
Hầu hết tất cả các trình biên dịch đều dịch mã thành các hướng dẫn đơn giản hơn, chẳng hạn như goto. Và kỹ thuật đảo ngược không thể kết hợp các hướng dẫn đơn giản hơn vào các hướng dẫn phức tạp hơn "tốt đẹp" mà bạn muốn thấy. Tôi không thấy Microsoft đang ép buộc chúng tôi sử dụng goto như thế nào, hoặc điều này có liên quan đến bài đăng này như thế nào.
TamusJRoyce

1
@StingyJack: nếu bạn nhìn vào mã được biên dịch, bạn sẽ thấy tất cả mã đó được chuyển thành các hướng dẫn JMP :) Tôi không quan tâm trình biên dịch làm gì dưới vỏ bọc, miễn là tôi có thể viết mã dễ đọc. (không phải là sử dụng goto đôi khi rất dễ đọc)
gbjbaanb

Nếu tôi đặt các lệnh hậu xây dựng của mình trong một lô, tôi nhận được thông báo lỗi này khi nhấn build:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
Sebastian

4
nếu bạn muốn, bạn có thể xóa ifvà sử dụnggoto :$(ConfigurationName)
Calimero100582

15

Visual Studio 2015: Cú pháp đúng là (giữ nó trên một dòng):

if "$(ConfigurationName)"=="My Debug CFG" ( xcopy "$(TargetDir)test1.tmp" "$(TargetDir)test.xml" /y) else ( xcopy "$(TargetDir)test2.tmp" "$(TargetDir)test.xml" /y)

Không có lỗi 255 ở đây.


3
giữ nó trên một dòng
Eric Bole-Feysot

Làm việc tốt Tks
Vinicius Gonçalves

1
Kỹ thuật có điều kiện của bạn làm việc tốt nhất cho tôi. Tuy nhiên, điều này làm việc thậm chí còn tốt hơn mà không có điều kiện nào cả và nó ngắn gọn hơn nhiều. sao chép "$ (ProjectDir) \ .. \ $ (Tên cấu hình) \ MyFileName" "$ (TargetDir)"
shawn1874

1
Kịch bản của bạn là chính xác, nhưng tập lệnh của tôi cho phép sao chép các tệp khác nhau cho các cấu hình khác nhau.
Eric Bole-Feysot

8

Kể từ Visual Studio 2019, .csprojđịnh dạng hiện đại hỗ trợ thêm một điều kiện trực tiếp vào thành Targetphần:

<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
    <Exec Command="nswag run nswag.json" />
</Target>

Giao diện người dùng không cung cấp cách thiết lập tính năng này, nhưng có vẻ như để lại Configurationthuộc tính một cách an toàn nếu bạn thực hiện thay đổi thông qua giao diện người dùng.


Điều này làm việc cho tôi trong VS 2019, cảm ơn bạn!
BrandoTheBrave

Điều này thực sự xứng đáng cao hơn, ngoài ra họ thực sự nên cập nhật giao diện người dùng để cho phép bạn đánh dấu Cấu hình xây dựng hoặc ít nhất là thêm Điều kiện từ các thuộc tính csproj.
DeadlyChambers

4

Bạn có thể chuyển tên cấu hình cho tập lệnh hậu xây dựng và kiểm tra nó trong đó để xem nó có nên chạy không.

Truyền tên cấu hình với $(ConfigurationName).

Kiểm tra nó dựa trên cách bạn đang thực hiện bước hậu xây dựng - nó sẽ là một đối số dòng lệnh.


-1

Điều này làm việc cho tôi trong Visual Studio 2015.

Tôi sao chép tất cả các tệp DLL từ một thư mục nằm trong thư mục thư viện ở cùng cấp độ với thư mục giải pháp của tôi vào thư mục tiêu của dự án đang được xây dựng.

Sử dụng một đường dẫn tương đối từ thư mục dự án của tôi và đi lên cấu trúc thư mục hai bước với .. \ .. \ lib

MySolutionFolder
.... MyProject
Lib

if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")

-2

Giống như bất kỳ cài đặt dự án nào, các bản dựng có thể được cấu hình cho mỗi Cấu hình. Chỉ cần chọn cấu hình bạn muốn thay đổi trong danh sách thả xuống của hộp thoại Trang thuộc tính và chỉnh sửa bước tạo bài.


10
Build Events không dành riêng cho bất kỳ cấu hình nào khi được tạo trong IDE.
Joseph Daigle

1
Không hoạt động trong VS2015. Không thể cấu hình trên mỗi cấu hình.
willem

2
Điều này chỉ áp dụng cho các dự án C ++ trong Visual Studio, không áp dụng cho C #
bytecode77

-3

Trong Visual Studio 2012 bạn phải sử dụng (tôi cũng nghĩ trong Visual Studio 2010)

if $(Configuration) == Debug xcopy

$(ConfigurationName) đã được liệt kê dưới dạng macro, nhưng nó không được chỉ định.

Nhập mô tả hình ảnh ở đây

So sánh: Macro cho các lệnh xây dựng và thuộc tính


7
Bạn muốn sử dụng tên cấu hình. Hình ảnh này ... thực sự khó hiểu với tất cả sự mờ ảo.
Rabbi tàng hình
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.