test โดย ignore vendor

อย่างที่ทราบว่าตั้งแต่ go version 1.5 เราสามารถเอา lib dependencies ทั้งหลายมาใส่ไว้ใน directory ที่ชื่อ vendor ได้ โดยที่โค้ดของเราจะมองหา package ที่อยู่ใน vendor นี้ก่อนเสมอ ทำให้เราสามารถ แช่แข็งเครื่องมือของเราเอาไว้ได้ โดยไม่ต้อง go get มาใหม่ ซึ่งจะลดผลกระทบจาก version ที่เปลี่ยนไปได้

แต่หลายคนที่เริ่มใช้ vendor ก็จะพบปัญหาบางอย่าง เช่นการเทส เพราะมีไม่น้อยที่เวลารันเทส จะสั่งประมาณนี้

go test ./…

สำหรับมือใหม่ ./… หมายถึงทุกๆ directory จาก จุดที่รันคำสั่ง เช่นเมื่อเราอยู่ที่  /home/pallat/workspace/gopath/src/mywork

แล้วเราสั่งว่า  go test ./… หมายความว่า ให้รันเทสที่ /home/pallat/workspace/gopath/src/mywork และ directory ในนี้ทั้งหมดด้วย

ทีนี้ เราก็ไม่อยากให้มันเทสของใน vendor เพราะอย่างน้อยของพวกนั้นก็ควรถูกเทสมาแล้ว เราแค่อยากจะเทสของที่เป็นของเราเท่านั้น ซึ่งก็มีวิธีอยู่ครับ ถ้าเอาง่ายๆเลยก็แบบนี้

go test $(go list ./… | grep -v /vendor/)

คำสั่งนี้มาจาก คำสั่ง go list ./… จะทำการ list ทุก package ออกมา แล้ว grep -v /vendor
คือการ grep แบบ invert match ผลลัพธ์จะได้ ทุก package ยกเว้นใน /vendor เพื่อมาส่งให้ go test อีกที

คิดว่าคงมีประโยชน์สำหรับคนที่ใช้ vendor อยู่ครับ