2012-12-08 32 views
18

Tôi đang cố gắng gọi nhiệm vụ đơn giản sau khi xuất bản sự kiện. Khi tôi nói "xuất bản", tôi có nghĩa là xuất bản trong Visual Studio, nhấp chuột phải vào dự án và nhấn "Xuất bản ...". Tôi đã bao gồm (nhập khẩu) mục tiêu tập tin trong tập tin dự án mà hoạt động tốt bởi vì tôi đã thử nghiệm nó trên sự kiện xây dựng. Tôi đã tìm thấy tại http://msdn.microsoft.com/en-us/library/ms366724.aspx rằng có sự kiện AfterPublish cần thực hiện những gì tôi cần nhưng không. Tôi không chắc liệu đây có phải là sự kiện tương tự sẽ kích hoạt trên Xuất bản trong Visual Studio hay không, ai đó vui lòng làm rõ điều này. Câu hỏi của tôi là cách kích hoạt bất kỳ loại tác vụ nào từ tệp mục tiêu trên Xuất bản trong Visual Studio?Sau khi xuất bản sự kiện trong Visual Studio

Tôi đã cố gắng này trong tập tin mục tiêu:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="AfterPublish"> 
     <Message Label="Test"></Message>   
     <Warning Label="Test"></Warning> 
    </Target> 
</Project> 

Tôi đang sử dụng Visual Studio 2010.

EDIT:

tôi thực sự tìm kiếm cách nào để thực hiện hành động nào đó vào Xuất bản trong Visual Studio. Tôi cũng đã nghĩ đến việc thêm Sự kiện xây dựng, nhưng tôi không biết làm thế nào để xác định xem nó có đang được xuất bản hay không.

EDIT: @Alexey Shcherbak cảm ơn bạn đã trả lời nhanh. Tôi nhận này trong đầu ra MSBuild tôi:

12/10/2012 12:29:40 AM:  Done executing task "CallTarget". 
12/10/2012 12:29:40 AM:  Done building target "PipelinePreDeployCopyAllFilesToOneFolder" in project "PublishTestApp.csproj". 
12/10/2012 12:29:40 AM:Done building project "PublishTestApp.csproj". 
Deleting existing files... 
Publishing folder /... 
Publishing folder Account... 
Publishing folder bin... 
Publishing folder Scripts... 
Publishing folder Styles... 
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ========== 
========== Publish: 1 succeeded, 0 failed, 0 skipped ========== 

Vì vậy, nhiệm vụ của tôi sẽ thực hiện ngay sau khi PipelinePreDeployCopyAllFilesToOneFolder nhưng trước khi đối phó thực tế của các tập tin và tôi không xem xét Xuất bản đang được thực hiện nhưng tại thời điểm đó. Tất nhiên, tôi đã thực sự thử nghiệm điều này, vì vậy trong nhiệm vụ MSBuild tôi đã thực hiện đọc đơn giản từ tập tin văn bản đó là giả sử để được sao chép trong thư mục Publish, và nó không thành công.

+0

đã thêm một phần khác để trả lời chỉnh sửa của bạn –

Trả lời

14

Trình đơn ngữ cảnh xuất bản không chạy mục tiêu "Xuất bản" (nếu chúng ta đang nói về trang web xuất bản, không xuất bản gói ClickOnce).

Nếu bạn đang sử dụng VS2010 - trình đơn ngữ cảnh sẽ chạy mục tiêu "PipelinePreDeployCopyAllFilesToOneFolder" và trong VS2012 (lưu ý nếu bạn định chuyển đổi) nó sẽ chạy mục tiêu "MSDeployPublish".

Tôi cho rằng bạn nên đọc this question and answer. Jez và tôi đã cung cấp câu trả lời khá toàn diện về cách móc vào Trước \ Sau khi xuất bản mục tiêu.

Nói tóm lại - cho MSBuild phiên bản> = 4.0 bạn có thể sử dụng phương pháp này

<Target Name="Mytarget" AfterTargets="PipelinePreDeployCopyAllFilesToOneFolder" > 
    <Message Label="Test"></Message>   
    <Warning Label="Test"></Warning> 
</Target> 

@ Edit1: sử dụng CopyAllFilesToSingleFolderForPackage thay vì PipelinePreDeployCopyAllFilesToOneFolder - các tập tin cần được sao chép sau khi mục tiêu này. Nếu bạn cần kích hoạt mục tiêu của mình chỉ khi nó được khởi chạy trong bối cảnh VS - hãy kiểm tra liên kết tôi đã đăng và thêm một số điều kiện nữa - để kiểm tra việc khởi chạy Visual studio như thế này Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='10.0'" Nếu bạn thêm bối cảnh khác như loại mục tiêu nào bạn muốn để khởi chạy sau khi xuất bản, v.v.- nó có thể thêm hoàn cảnh và giúp đỡ người khác để hiểu được vấn đề

+0

Vui lòng xem cập nhật được đề cập, cảm ơn bạn. –

+0

Đây là 'Mục tiêu' mà tôi đang tìm kiếm (nếu có một bài đăng trên blog mô tả TẤT CẢ mục tiêu MSBuild tôi đánh giá cao bất kỳ ai đã chia sẻ nó). Vấn đề của tôi là tôi muốn chuyển đổi các tập tin để chuyển đổi chỉ trên xuất bản, không xây dựng. –

+0

@RobScott AFAIK không có điều gì - cách MSBuild được thiết kế ngụ ý rằng bộ mục tiêu của bạn và phiên bản của chúng (và ghi đè) khá độc đáo đối với máy của bạn và phụ thuộc vào loại SDKs \ project types \ phiên bản nào của msbuild và VS bạn có Cài đặt. Nó tự động soạn một kịch bản xây dựng dựa trên môi trường của bạn. Điều này là rất mạnh mẽ nhưng rất mong manh cùng một lúc. Vì vậy, nó không thể có bất kỳ danh sách toàn diện các mục tiêu. Bạn có thể tìm hiểu cách đọc nhật ký chi tiết và cách đọc các tệp .targets để bạn có thể tìm thấy những gì bạn cần, nhưng không có bảng cheat = ( –

4

tôi chỉ viết một bài về cách tôi đạt được điều này trong Visual Studio 2013 ở đây: http://www.alexdresko.com/2015/02/28/taking-visual-studio-build-and-publish-events-to-the-next-level/

Về cơ bản, đây là sự kỳ diệu:

<Target Name="Mytarget" AfterTargets="MSDeployPublish" > 
    <Message Text="The name of the publish profile is $(DestinationAppRoot)"/> 
    .... Here's where you do something awesome... 
</Target> 

Tôi khuyến khích bạn đọc toàn bộ bài đăng để biết thêm thông tin.

+1

Có thêm biến nào khác như $ (DestinationAppRoot) để truy cập URL đích không? –

+0

Tôi không biết, thành thật. Hãy thử tìm kiếm toàn bộ ổ cứng của bạn cho 'DestinationAppRoot' và Tôi không thực sự nhớ làm thế nào tôi đã đưa ra các giải pháp được đăng ở đây. :) –

0

Câu trả lời của tôi cho một câu hỏi khác có thể là một số cách sử dụng.

AfterPublish script doesn't run when I publish a web app

Đặc biệt, sử dụng đường dẫn đến 'file được xuất bản, bạn có thể vượt qua trong một tham số qua $(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder). Đây sẽ là một cái gì đó như c:\{path to *.csproj}\obj\{build configuration}\Package\PackageTmp.

+0

Vì vậy, có lẽ điều này nên được bình chọn là một bản sao thay vì sau đó? –

+0

Tôi không biết nếu nó là 'chính xác trùng lặp' ... chỉ nghĩ rằng thông tin của tôi trên câu trả lời khác có thể hữu ích trong việc đưa anh ta một số nơi. Sẽ cho phép bạn gắn cờ nếu bạn cho là bắt buộc. Cảm ơn. – Terry

+0

Tôi không có chuyên gia nào ở đây. Nếu bài đăng không phải là bản sao, hãy điều chỉnh câu trả lời của bạn cho câu hỏi, ngay cả các liên kết nội bộ cũng có thể biến mất và sau đó khách truy cập trong tương lai bị kẹt với liên kết 'xem tại đây' không trỏ đến đâu cả. –

1

Tôi đã thử mọi câu trả lời khác nhưng chúng không hoạt động. Trong trường hợp của tôi, tôi xuất bản một VSTO Add-In với VS2015, như vậy có lẽ có điều gì đó khác nhau xảy ra, nhưng đây là hai lựa chọn đó đã làm việc:

<Target Name="AfterPublish"> 
    <Warning Text="publish warning 1" /> 
</Target> 
<Target Name="CustomTarget" AfterTargets="AfterPublish"> 
    <Warning Text="publish warning 2" /> 
</Target> 

Một phần lý do tôi (và assumedly khác) đã có một thời gian khó khăn với điều này là nhiệm vụ Message dường như không làm bất cứ điều gì. Tôi đã mong đợi văn bản ở chế độ xem Output nhưng không có gì hiển thị. Không có Message mục nào trong số Error List, nhưng bằng cách sử dụng Warning thay vào đó, chúng đã xuất hiện trong Error List. Thật không may tôi không biết đủ về MSBuild để nói lý do tại sao Message không hoạt động như mong đợi.

+1

Tôi đã thử các tính năng này trong VS.NET 2017 RC4 và AfterTargets = "AfterPublish". Cảm ơn. – dstr

Các vấn đề liên quan