TFS Build 2010 - ย่อขนาด JS/CSS ก่อนปรับใช้

ฉันได้รับ Ajax minifier เพื่อลดขนาดไฟล์ JS และ CSS บางไฟล์โดยเป็นส่วนหนึ่งของกระบวนการสร้าง/แพ็คเกจ/ปรับใช้ มันเป็นเครื่องมือที่ยอดเยี่ยมและทำสิ่งที่เราต้องการได้อย่างแท้จริง อย่างไรก็ตาม การรวมสิ่งนี้เข้ากับกระบวนการสร้าง/ปรับใช้ของเรานั้นพิสูจน์ได้ยากมาก

ตามหลักการแล้ว เราต้องการเรียกใช้เครื่องมือนี้ เฉพาะ เมื่อเราดำเนินการหนึ่งในรุ่น TFS 2010 ของเรา (เช่น ไม่ใช่ รุ่นท้องถิ่น (Ctrl+Shift+B jobbie) บนเครื่อง dev ). นอกจากนี้ เราต้องการแทนที่ไฟล์ที่ 'ไม่ย่อขนาด' ในปัจจุบันของเราในสถานการณ์นี้ด้วยไฟล์ที่ย่อขนาด (เช่น ภายใต้ชื่อไฟล์เดียวกัน) แทนที่จะโหลดไฟล์เพิ่มเติมชื่อ '.min.js' เป็นต้น

หลังจากอ่านมาหลายครั้ง ฉันคิดว่ากุญแจสำคัญสำหรับงานสร้างแบบกำหนดเองภายในเวิร์กโฟลว์ - แต่ฉันไม่รู้ว่าจะจัดการสิ่งนี้อย่างไร - โดยเฉพาะอย่างยิ่งในขณะที่ฉันต้องการย่อขนาดไฟล์ที่จะถูกดึงลงมาโดยตรงจากรุ่นของเรา สาขาใน TFS (เช่น ไม่ได้อยู่ในพื้นที่ทำงานในพื้นที่ของใครบางคน) โดยเป็นส่วนหนึ่งของรุ่น TFS 2010

นี่เป็นการสนทนาที่ใกล้เคียงที่สุดที่ฉันพบกับสิ่งที่ฉันพยายามทำให้สำเร็จ: Microsoft Ajax Minifier - เวิร์กโฟลว์ TFS 2010 - AjaxMin ใน TFS Build

ฉันเชื่อว่าฉันจะต้องมีกิจกรรมโค้ดที่กำหนดเองภายในเวิร์กโฟลว์การสร้าง แต่ไม่มีความคิดเกี่ยวกับวิธีการสร้างกิจกรรมเพื่อแก้ไขปัญหานี้ มีใครให้ความกระจ่างเกี่ยวกับกระบวนการที่จะยอมให้มีการลดขนาดลงก่อนนำไปใช้งานได้หรือไม่


person harman_kardon    schedule 20.09.2011    source แหล่งที่มา


คำตอบ (3)


ตกลง - ขอบคุณคำตอบเหล่านี้และการวิจัยมากมาย... ฉันมาถึงวิธีแก้ปัญหาต่อไปนี้ :)

เริ่มต้นด้วยกิจกรรมโค้ดแบบกำหนดเอง ฉันพยายามเรียกใช้ตัวย่อจากโค้ด C# จากนั้นจึงเรียกกิจกรรมนั้นเป็นส่วนหนึ่งของเวิร์กโฟลว์ สิ่งนี้ใช้งานไม่ได้เนื่องจากตัวย่อเวอร์ชัน .dll แสดงวิธีการสองสามวิธีในการบีบอัดไฟล์ .js และ .css จากนั้นทำให้คุณเปิด StreamWriter บางประเภทและเขียนไฟล์ใหม่ด้วยสตริงที่บีบอัดที่ส่งคืนมาจาก วิธีการ (หากคุณต้องการเขียนทับไฟล์ที่มีอยู่) การเปิดและปิดไฟล์ค่อนข้างเข้มข้นตลอดทั้งวัน ดังนั้นฉันจึงไม่ค่อยพอใจกับวิธีแก้ปัญหานั้น การใช้คลาสกระบวนการเพื่อรัน .exe โดยเปิดตัวเลือก -clobber (สำหรับการเขียนทับไฟล์) ก็ไม่เหมาะเช่นกัน และให้ผลลัพธ์ที่แปลก (ไม่ย่อขนาดไฟล์อย่างถูกต้องและเขียนขยะที่ส่วนหัวของแต่ละไฟล์)

คุณถามวิธีแก้ปัญหาที่ฉันตัดสินใจคือการเขียนสคริปต์ PowerShell (จุดเริ่มต้นที่ฉันได้รับจาก ที่นี่ - ซึ่งฉันแก้ไขเล็กน้อยเพื่อใช้พารามิเตอร์บรรทัดคำสั่ง - ซึ่งจะเป็นโฟลเดอร์รูทของโครงการของคุณ สคริปต์จะวนซ้ำผ่านแต่ละไฟล์ (และไฟล์ของไดเรกทอรีย่อยแต่ละไฟล์) และลดขนาด .css และ . js อยู่ข้างใน ค่อนข้างเรียบร้อย กระดูกที่มีลักษณะดังนี้:

$ScriptDirectory = $args[0]
Write-Host "Validating directory parameter: $ScriptDirectory"
Write-Host ""

if ((Test-Path -path $ScriptDirectory) -ne $True)
{
     #Throw an error of some kind (the parameter passed in isn't a valid directory).
}

$Minifier = “C:\Program Files\Microsoft\Microsoft Ajax Minifier 4\AjaxMin.exe”

get-childitem $ScriptDirectory -recurse -force -include *.js, *.css -exclude *.min.js, *.min.css | foreach-object {&$Minifier $_.FullName -out $_.FullName -clobber}

ดังนั้นเราจึงดูแต่ละรายการย่อยของโฟลเดอร์รูทที่มีนามสกุล .js หรือ .css (โดยไม่สนใจนามสกุล .min.* เนื่องจากส่วนขยายเหล่านี้ถูกบีบอัดแล้ว)

ใน TFS สิ่งที่เราต้องทำคือเพิ่ม InvokeProcess ขั้นตอนใน รันสคริปต์ PowerShell ใน TFS คุณสามารถส่งพารามิเตอร์ของคุณใน (ไดเร็กทอรีเพื่อเริ่มย่อขนาด) โดยใช้คุณสมบัติ Arguments ของกิจกรรม InvokeProcess

หากต้องการรับไดเร็กทอรีที่บิลด์ TFS ใช้เพื่อคอมไพล์โค้ดของคุณก่อนที่จะเผยแพร่ (พื้นที่ทำงานชั่วคราว หากคุณต้องการ) คุณสามารถใช้ตัวแปร SourcesDirectory ที่คุณสามารถใช้ได้ในลำดับ Run On Agent ของบิลด์ นี่คือตำแหน่งที่ไฟล์ของคุณได้รับการคอมไพล์และจัดทำแพ็กเกจโดยกระบวนการสร้าง TFS ดังนั้นสิ่งใดก็ตามที่ได้รับการย่อขนาดที่นี่จะจบลงในแพ็คเกจการปรับใช้ขั้นสุดท้าย

ป.ล. - SourcesDirectory ค่อนข้างสูง - คุณอาจไม่ต้องการเจาะลึกไปจนถึงไฟล์ .js และ .css ของคุณ ดังนั้นคุณต้องระบุสิ่งที่ชอบ:

SourcesDirectory + "/" + "MyProjectFolder/Scripts"

ตรวจสอบให้แน่ใจว่าคุณเพิ่มขั้นตอน InvokeProcess นี้ก่อนที่โค้ดของคุณจะถูกปรับใช้ในเวิร์กโฟลว์และเฮ้เพรสโต - คุณจะมีไฟล์ .js และ .css ที่ย่อขนาด ซึ่งเก็บชื่อไฟล์ต้นฉบับไว้เป็นส่วนหนึ่งของบิลด์ TFS เท่านั้น ไม่ใช่ไฟล์ในเครื่อง .

ขอบคุณทุกท่านที่ตอบและชี้แนะให้ผมไปในทิศทางที่ถูกต้อง ฉันหวังว่านี่จะช่วยใครสักคนได้ตลอดทาง!

person harman_kardon    schedule 22.09.2011

การทำเช่นนี้เป็นกิจกรรมโค้ดที่กำหนดเองสามารถทำได้อย่างแน่นอน แต่คุณจะต้องใช้ความพยายามบ้าง ข้อเสนอแนะของฉันคือ:

  1. ขั้นแรกให้ติดตามบล็อกการปรับแต่ง TFS 2010 จาก Ewald Hofman ที่ http://www.ewaldhofman.nl/post/2010/04/29/Customize-Team-Build-2010-e28093-Part-4-Create-your-own-activity.aspx เพื่อเรียนรู้เกี่ยวกับการสร้างกิจกรรมที่กำหนดเอง
  2. จากนั้นลองดูที่ http://www.ewaldhofman.nl/post/2010/06/01/Customize-Team-Build-2010-e28093-Part-10-Include-Version-Number-in-the-Build-Number.aspx จากซีรีส์เดียวกันเพื่อใช้กลไกในการค้นหาไฟล์ทั้งหมดที่สอดคล้องกับรูปแบบที่กำหนด ในตัวอย่างนี้ ไฟล์ assemblyInfo.cs จะถูกสร้างดัชนีและเนื้อหามีการเปลี่ยนแปลง แทนที่ด้วยการค้นหาไฟล์ *.js ของคุณ
  3. ปลดปล่อยพลังของ Ajax Minifier ในการเลือกไฟล์ของคุณและแทนที่ไฟล์ต้นฉบับด้วยไฟล์ที่ย่อขนาด
  4. สร้างกิจกรรม รวมเป็นขั้นตอนในเทมเพลตกระบวนการสร้างที่คุณใช้ใน TFS 2010 (ตามที่อธิบายไว้ในโพสต์บล็อกเดียวกัน) และปรับแต่งให้ตรงจุดที่คุณพอใจ

หรือคุณสามารถขอให้ผู้เขียนโพสต์ที่คุณรวมไว้ในคำถามของคุณเพื่อแบ่งปันกิจกรรม Minifier TFS ที่เขาสร้างกับเรา :-)

โปรดแจ้งให้เราทราบว่ามันได้ผลสำหรับคุณอย่างไร

person kroonwijk    schedule 20.09.2011
comment
ฉันอยากจะแบ่งปัน...แต่ฉันทำเพื่อการทำงาน แต่ฉันจะเขียนใหม่เพื่อพวกคุณ (และสำหรับส่วนขยายชุมชน TFS) เช่นกัน สถานที่ที่ดีที่สุดสำหรับมันคืออะไร? กิต? วางถัง? - person Issa Fram; 21.09.2011

คุณต้องใช้ Invoke Process Activity เพื่อให้ Minifier ได้รับการดำเนินการระหว่างการสร้าง TFS ของคุณ

เพื่อจุดประสงค์นี้ คุณจะต้องติดตั้งตัวย่อในเซิร์ฟเวอร์ที่ทำบิลด์ของคุณ ซึ่งเรียกว่า Build-Agent เมื่อทำเช่นนั้น คุณจะมั่นใจได้ว่า Minifier จะถูกเรียกใช้เฉพาะระหว่าง TFS-Builds ของคุณเท่านั้น (ซึ่งตรงข้ามกับ VS-Builds ในเครื่อง)

ในการเปลี่ยนชื่อไฟล์เอาต์พุตที่คุณสร้างขึ้น (*.min.js) คุณจะต้องดำเนินกิจกรรมที่กำหนดเองอื่นเพื่อสิ่งนั้นโดยเฉพาะ การเขียนทับไฟล์ที่เช็คอินของคุณจำเป็นต้องทำให้สามารถเขียนได้ก่อน ซึ่งหมายถึงกิจกรรมที่กำหนดเองอีกอย่างหนึ่ง (ฉันได้ระบุไว้ใน คำตอบอื่น ตัวอย่างสำหรับสิ่งนั้น)

การออกแบบท่าเต้นทั้งหมดคือ
เรียกใช้ Minifier ด้วย InvokeProcess --> ทำให้ไฟล์ที่เช็คอินสามารถเขียนได้ --> เขียนทับไฟล์ที่เช็คอินด้วยไฟล์ที่ย่อขนาดที่ถูกเปลี่ยนชื่อ.

วิธีที่ถูกต้องในการดำเนินการนี้ใน TFS build คือการล้อมไว้ใน Sequence

โพสต์บล็อกเบื้องต้นที่ดีเกี่ยวกับวิธีใช้กระบวนการวิงวอนจะพบได้ ที่นี่.
ฉันยังพบ ซีรีส์ โดย E.Hofman มีคุณค่าอย่างแท้จริง

person pantelif    schedule 20.09.2011
comment
ขอบคุณ - นั่นชี้ให้ฉันไปในทิศทางที่ถูกต้อง คำถามสั้นๆ อีกข้อ - ฉันจะรับพาธของไฟล์ .js และ .css ที่ฉันต้องการย่อขนาดได้อย่างไร เนื่องจากไฟล์เหล่านี้ลงมาจากการควบคุมเวอร์ชันโดยตรง และอยู่ในพื้นที่ทำงานชั่วคราวบางประเภทบน build agent ถูกต้องหรือไม่ - person harman_kardon; 21.09.2011
comment
ลองดูในกล่องเครื่องมือสำหรับกิจกรรมการสร้างรากฐานของทีม ในนั้นคุณจะพบ ConvertWorkspaceItem & ConvertWorkspaceItems ที่ยอมรับเป็นอินพุตเครื่องหมายควบคุมแหล่งที่มาของไฟล์ ($/...) และส่งคืนเส้นทางจริงปัจจุบันไปยังไฟล์ - person pantelif; 21.09.2011
comment
อย่าเรียกใช้...นั่นไม่ได้รับการจัดการ คำถามที่คุณเชื่อมโยงในโพสต์ต้นฉบับของคุณนั้นเป็นของฉัน ติดต่อฉันทางอีเมล ฉันจะแสดงให้คุณเห็นว่าฉันทำมันได้อย่างไร - person Issa Fram; 21.09.2011
comment
@IssaFram: จะดีกว่าไหมถ้าแบ่งปันวิธีแก้ปัญหาของคุณกับพวกเราที่เหลือ ฉันจะสนใจโดยสิ้นเชิง! - person pantelif; 21.09.2011
comment
ฉันอยากจะแบ่งปัน...แต่ฉันทำเพื่อการทำงาน แต่ฉันจะเขียนใหม่เพื่อพวกคุณ (และสำหรับส่วนขยายชุมชน TFS) เช่นกัน สถานที่ที่ดีที่สุดสำหรับมันคืออะไร? กิต? วางถัง? - person Issa Fram; 21.09.2011