2009-10-21 20 views
17

Tác vụ Ant exec có thuộc tính đầu ra có thể được sử dụng để báo cho Ant biết đầu ra đi đâu. Tôi đã sử dụng nó để chuyển hướng đầu ra đến một tập tin. Vấn đề là, nếu tôi không làm điều gì đó với đầu ra, những thứ mà Ant in không phải là một sự trợ giúp - nó không hoàn chỉnh.Làm thế nào tôi có thể đảm bảo tất cả các đầu ra từ nhiệm vụ exec của Ant đi đến stdout?

Có cách nào khác để đặt thuộc tính đầu ra thành System.out không?

Trả lời

1

Kết quả của execkhông đi đến tiêu chuẩn ra trừ bạn chỉ định các thuộc tính output.

+0

hiến Sản lượng kiến ​​không phải là toàn bộ sản lượng. Nếu tôi chuyển hướng nó đến một tập tin, tôi nhận được một điều hoàn toàn khác. – Geo

+0

Điều này đúng cho các hệ thống Unix. Nhưng trên các hệ thống cửa sổ, nếu bạn gọi một tập tin batch mà lần lượt gọi các lệnh khác (như 'node.exe'), thì stdout và stderror từ tiến trình node.exe con bị mất. Xem _hack_ tôi mô tả như là một câu trả lời nếu bạn đang ở trên cửa sổ và có vấn đề này. – darcyparker

0

Nếu bạn muốn xuất sang System.out, sau đó chỉ cần không chỉ định thuộc tính "đầu ra". Nếu bạn muốn chuyển hướng đến một tập tin và in nó vào System.out, bạn có thể sử dụng lệnh tee, sẽ chuyển hướng đầu ra đến một tệp nhất định và cũng có thể echo nó ra tiêu chuẩn ... Tôi không biết nếu Windows hỗ trợ " tee "hoặc tương đương.

0

Có thể bạn muốn xem các thuộc tính error, logErrorerrorproperty của nhiệm vụ exec. Những thỏa thuận với việc xử lý các dòng lỗi tiêu chuẩn từ quá trình exec'd. Có thể có thông tin hữu ích ở đó đang diễn ra vì lý do nào đó - có thể giải thích cho sự không hoàn hảo mà bạn thấy.

Nhưng, nếu quá trình exec'd quyết định đóng stdout hoặc stderr và gửi chúng ở nơi khác - có rất ít bạn có thể làm.

14

Khi thực thi tệp lô với tác vụ apply hoặc exec của kiến ​​trên Windows, tôi thấy có trường hợp đặc biệt trong đó một số stdout và stderr không bị bắt bởi kiến. (Ví dụ: nếu bạn gọi một tập tin batch mà lần lượt gọi các lệnh khác (như node.exe), sau đó stdout và stderror từ quá trình con node.exe bị mất.)

Tôi đã dành một thời gian dài cố gắng để gỡ lỗi này! Có vẻ như stdout của tập tin batch và stderr bị bắt, tuy nhiên các lệnh được gọi bởi tập tin thực thi bằng cách nào đó không được nhìn thấy bởi ant. (có lẽ vì chúng là các quá trình con riêng biệt). Sử dụng các thuộc tính outputerror như được đề xuất ở trên không giúp đỡ vì chỉ một số số của giá trị stdout và/hoặc tiêu chuẩn bị bắt.

Các giải pháp tôi đã đưa ra (một Hack) là thêm những lập luận ở phần cuối của lệnh:

<!--Next arg: forces node's stderror and stdout to a temporary file--> 
<arg line=" &gt; _tempfile.out 2&lt;&amp;1"/> 

<!--Next arg: If command exits with an error, then output the temporary file to stdout, --> 
<!--delete the temporary file and finally exit with error level 1 so that --> 
<!--the apply task can catch the error if @failonerror="true"    --> 
<arg line=" || (type _tempfile.out &amp; del _tempfile.out &amp; exit /b 1)"/> 

<!--Next arg: Otherwise, just type the temporary file and delete it--> 
<arg line=" &amp; type _tempfile.out &amp; del _tempfile.out &amp;"/> 

Bởi vì đây Hack chỉ áp dụng cho các cửa sổ, hãy nhớ thêm @osfamily="windows" để nhiệm vụ apply hoặc exec. Và tạo các tác vụ tương tự cho `@ osfamily =" unix ", vv nhưng không có các đối số thừa này.

+0

Rất cám ơn, Darcy! – JonnyReeves

+0

Cuối cùng! Hoạt động tuyệt vời, thx. –

0

Tôi đã gặp phải sự cố tương tự: kết quả thực thi lệnh đã bị chặn. Có lẽ đó là tác dụng phụ khi chạy cmd trong WinXP (Tôi sử dụng maven-antrun-plugin).Dù sao thiết output="con" làm việc ra một cách hoàn hảo:

<configuration> 
    <target> 
     <exec executable="cmd" output="con"> 
      <arg value="/c" /> 
      <arg value="..." /> 
     </exec> 
    </target> 
</configuration> 
0

Làm việc với Gruntjs Ant và:

Đối với bất cứ ai cố gắng để có được điều này để làm việc sử dụng Gruntjs. Tôi đã có thể làm cho nó hoạt động bằng cách làm như sau (kết hợp với câu trả lời của darcyparker).

Trong Ant Build file của tôi:

<target description="run grunt js tasks" name="grunt"> 
    <exec dir="/path/to/grunt" executable="cmd" failonerror="true"> 
     <arg value="/c"/> 
     <arg value="jshint.bat"/> // I broke each task into it's own exec 
     <arg line=" &gt; jshint.log 2&lt;&amp;1"/> 
     <arg line=" || (type jshint.log &amp; del jshint.log &amp; exit /b 1)"/> 
     <arg line=" &amp; type jshint.log &amp; del jshint.log &amp;"/> 
    </exec> 
    <exec dir="/path/to/grunt" executable="cmd" failonerror="true"> 
     // another grunt task (IE: uglify, cssmin, ect..) 
    </exec> 
</target> 

jshint.bat

@echo off 
pushd "C:\path\to\grunt\" 
@ECHO _____________________________________________ 
@ECHO GRUNT JSHINT 
@ECHO _____________________________________________ 
grunt jshint --stack >>jshint.log 

Chú ý: Đường dẫn đến grunt sẽ là nơi bạn Gruntfile.js là nằm. Cũng lưu ý, ban đầu tôi phải tạo tệp nhật ký (để làm cho nó hoạt động với câu trả lời của darcyparker) sẽ xuất ra dấu vết ngăn xếp từ nhiệm vụ cụ thể đó. Điều này sau đó sẽ cung cấp cho tôi đầu ra ngăn xếp nhiệm vụ grunt từ bất cứ nơi nào tôi gọi là mục tiêu kiến ​​của tôi.

Cuối cùng lưu ý rằng pushd "C:\path\to\grunt\" sẽ không mất thời gian nếu các tệp dơi của bạn nằm trong cùng thư mục với số Gruntfile.js.

0

Tôi đã gặp phải cùng một loại vấn đề này cố gắng để có được quá trình xây dựng thất bại trong Ant sau khi thử nghiệm Karma cố tình thất bại, và thực hiện chúng với "kiểm tra grunt".

Chỉ cần thêm/c trước khi "thử nghiệm grunt", và nó làm việc như một nét duyên dáng

<target name="unittest"> 
    <echo>*** KARMA UNIT TESTING ***</echo> 
    <exec dir="api_ui" executable="cmd" osfamily="windows" logError="yes" failonerror="true"> 
     <arg value="/c grunt test"/> 
    </exec> 
</target> 
Các vấn đề liên quan