Visual Studio: Nhiều lệnh sau xây dựng?


101

Visual Studio 2008 cho phép tôi khai báo một lệnh và đính kèm nó vào sự kiện hậu xây dựng cho một dự án. Giống như nhiều nhà phát triển, tôi thường xuyên sử dụng nó để xcopy các tệp vào thư mục đầu ra của ứng dụng.

Tôi đang làm việc trong một dự án mà tôi cần xcopy tệp từ hai nơi khác nhau đến hai đích khác nhau, tất cả đều nằm trong một dự án duy nhất. Nói cách khác, tôi cần gọi hai lệnh xcopy khác nhau từ cùng một sự kiện sau xây dựng. Có vẻ như sự kiện hậu xây dựng sẽ chỉ thực hiện một lệnh duy nhất và nếu tôi cần gọi nhiều lệnh, tôi sẽ phải đặt các lệnh trong tệp * .bat và gọi lệnh đó từ sự kiện sau xây dựng.

Điều đó có chính xác không, hay có cách nào đơn giản hơn để gọi hai lệnh từ sự kiện sau xây dựng? Cảm ơn trước sự giúp đỡ của bạn.

Câu trả lời:


124

Bạn có thể nhập bao nhiêu lệnh xây dựng bài đăng tùy thích. Chỉ cần tách chúng theo dòng mới.

Đây là một ví dụ từ một trong những dự án của tôi.

Đăng dòng lệnh tạo sự kiện


3
Bao gồm một ảnh chụp màn hình chỉ hữu ích nếu bạn có ý định lưu trữ nó mãi mãi.
Amandalishus

1
@ OWenJ23 ... hoặc 'imageshack' trong trường hợp này;)
Anthony Walsh

28
Mặc dù nằm trên các dòng riêng biệt, các lệnh của tôi đang được chạy cùng nhau như thể chúng trên một dòng.
Trevor

6
Thật không may, có vẻ như ít nhất VS2015 không báo lỗi nếu một trong các lệnh trung gian bị lỗi ... nó báo cáo kết quả của lệnh cuối cùng là kết quả của bước sau xây dựng.
Johannes S.

3
Có vẻ như điều này hoạt động từ bên trong Visual Studio - nhưng không được hỗ trợ nếu bạn sử dụng MsBuild trên máy xây dựng TFS. MsBuild loại bỏ các ngắt dòng và sau đó không thực hiện được lệnh do cú pháp sai.
Jeff B

107

Quan trọng: Khi thực thi một tệp loạt, bạn phải sử dụng câu lệnh "gọi" theo thứ tự các dòng sau sẽ được thực thi. Nếu bạn không sử dụng "call", việc thực thi sẽ chuyển sang .bat và sẽ không quay lại các dòng sau. Tương tự như trên lời nhắc DOS.

ví dụ:

call MyBatch1.bat
call MyBatch2.bat

3
Mẹo này áp dụng cho các lệnh grunt và npm vì cả hai đều chạy qua các tệp hàng loạt (grunt.cmd và npm.cmd).
Matt Varblow

16

Có một tùy chọn khác: bạn có thể tách các lệnh với &&. Ví dụ

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

Điều này không hoàn toàn giống với tách bằng dòng mới: với &&, nếu lệnh trước đó không thành công, dấu phẩy tiếp theo sẽ không chạy.

Phân tách theo dòng mới dễ đọc hơn, vì vậy bạn nên thích nó hơn. Tuy nhiên tôi biết ít nhất một trường hợp khi nào &&là hữu ích. Đó là kịch bản, khi bạn sử dụng các trang thuộc tính để có các bước sau xây dựng khác nhau trên các máy khác nhau. VS 2008 không cho phép đặt PostBuildStep trực tiếp trong các trang thuộc tính, nhưng bạn có thể thêm macro người dùng bằng lệnh của mình và gọi nó từ cài đặt dự án chính. Một macro là một dòng, vì vậy bạn có thể sử dụng &&để có nhiều lệnh ở đó.


11

Mỗi lệnh phải nằm trên một dòng riêng biệt. Tuy nhiên, những gì tôi phát hiện ra là nếu có lỗi khi thực hiện một trong những lệnh đó, toàn bộ quá trình tạo hậu kỳ không thành công và vì vậy bạn sẽ cần thử từng lệnh sau xây dựng một lần để gỡ lỗi.


2
"xcopy / f" sẽ hiển thị toàn bộ nguồn và tên tệp đích, sẽ được in trước khi bị lỗi, làm cho nhiều lệnh xcopy dễ chẩn đoán hơn nhiều lệnh sao chép.
yoyo

9

Tách các lệnh bằng & hoặc && hoặc; không hoạt động trong VS2017. Không thể tin rằng chức năng đơn giản như vậy không có sẵn trong VS2017. Visual studio cố gắng thực thi toàn bộ văn bản trong cửa sổ sự kiện xây dựng bài đăng dưới dạng một chuỗi. Lựa chọn duy nhất cho tôi bây giờ là tạo một tập lệnh hàng loạt mà tôi đặc biệt không thích.


1
Tách các lệnh bằng && phù hợp với tôi trong VS2017. Việc chỉ định từng lệnh trên một dòng riêng biệt trong trình chỉnh sửa VS2017 không hoạt động đối với tôi.
Codeniffer

5

Thêm vào câu trả lời của womp :

Nếu bạn có nhiều trang thuộc tính cần làm gì đó trên cùng một sự kiện xây dựng, bạn có thể làm như sau để xâu chuỗi các lệnh:

%(Command)
echo foo

nơi %(Command)mở rộng đến giá trị trước đó của lệnh.

Cá nhân tôi làm điều này cho tất cả các sự kiện xây dựng, ngay cả khi tôi hiện không có lệnh kế thừa, vì điều này đảm bảo sẽ không có vấn đề gì nếu tôi thêm các trang thuộc tính sau này.


1
Điều này cũng hoạt động với Bước xây dựng tùy chỉnh. Ngoài ra, việc thực hiện một exitcâu lệnh batch ở bất kỳ đâu dọc theo chuỗi sẽ khiến chuỗi ngừng hoạt động. Quả thực exit 1khiến quá trình xây dựng không thành công trong khi exit 0chỉ cần hủy bỏ bước và quá trình xây dựng tiếp tục.
Martin Connell

3

Trong Visual Studio 2017, bạn có thể làm điều này:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>

1
Tôi đã chỉnh sửa .csproj và thêm <Command> </Command> xung quanh hai lệnh sự kiện postbuild của tôi. Điều đó dường như không hoạt động. Khi tôi xem trong Sự kiện xây dựng trong Visual Studio, nó có <Command> </Command> xung quanh hai lệnh, nhưng lại xuất hiện lỗi xây dựng: Lệnh "<Command xmlns =" ​​.. "> command1 command2 </Command>" thoát ra với mã 255.
Jimmy

1

Cách tiếp cận do womp đề xuất hoạt động trong Visual Studio 2015/2017 (Windows), nhưng không hoạt động trong Visual Studio cho Mac (Xem trước), dường như chỉ thực thi lệnh đầu tiên. Cách tiếp cận duy nhất mà tôi thấy hoạt động trong cả hai phiên bản Mac và Windows của Visual Studio là chuỗi 2 lệnh MSBuild:

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

Ví dụ trên sử dụng sự kiện "AfterResolveRefferences" nhưng rõ ràng cũng sẽ hoạt động cho sự kiện PostBuild.


1

Không có giải pháp tốt cho vấn đề này. Ý tưởng cuộc gọi thực sự khiến các tập lệnh khác chạy. Tôi đã nhận thấy rằng tính năng phát hiện lỗi sẽ không hoạt động. Đặt 'exit / b 1' vào FailMe.cmd Việc sử dụng 'call FailMe.cmd' trong các bước xây dựng bài đăng. Chú ý việc xây dựng không bị lỗi? Tôi đang sử dụng VS 2017 để xây dựng một dự án C #. Bây giờ hãy thử nó với 'FailMe.cmd' Bản dựng hiện báo lỗi.

Vì vậy, tốt hơn hết bạn chỉ nên sử dụng một tập lệnh duy nhất, nếu việc báo cáo lỗi là quan trọng.


-4

Chỉ cần tiền tố "gọi" đến tập lệnh hàng loạt của bạn. Vì vậy, các câu lệnh bên dưới tập lệnh Batch cũng được thực thi sau khi trả về cuộc gọi từ tập lệnh lô.

call Script1.cmd
call Script2.bat
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.