Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[iThome第8屆鐵人賽 03]CI - VS是如何建制(Build) .Net專案

在上篇了解到說什麼是DevOps之後,我們就開始探討第一個部分,也就是Continous Integration (CI)。

CI最基本的核心就是build專案 - 所以我們需要了解一下到底VS是如何build專案的,只有了解之後我們才能夠把它腳本化,也才有可能自動化。

因此,這篇將會介紹:

  1. VS到底如何建制專案
  2. 什麼是build tool
  3. 為什麼接下來系列會選擇使用psake作為build tool

VS到底如何建制專案

我相信這個問題,很大的可能寫了2~3年的.Net programmer可能都回答不出來。原因是VS實在太方便了,.Net工程師太依賴於這種便利性,反而對於底層運作不需要那麼清楚。

說實話,我覺的這個是 好事,因為工程師就能夠focus在重要的地方,不過壞處就是如果有問題或者想做點調整可能無從下手,因為從來沒有那種概念。像我當初轉到Eclipse就有發現,很多VS幫我們做掉了,而 Eclipse就需要手動設定

其實別說建制專案了,很多工程師連程式最小單位,如何編譯一個cs檔案都不知道如何去做,所以,我會從最底層開始說起。

如何編譯CS程式碼

我們都知道程式碼是需要編譯才能夠使用,但是到底如何編譯呢?

其實很簡單,當我們安裝了VS的時候會自動安裝一個csc.exe的程式,而這個程式就是c# compiler。

我們可以打開visual studio安裝時候帶的Developer Command Prompt, 然後這個時候建立一個簡單的hello world cs檔案,然後輸入:csc helloWorld.cs,我們就會得到一個helloWorld.exe, 執行起來就是我們的程式

image
先建立一個helloWorld.cs的檔案image
打開Developer Command Promptimage
在編譯之前沒有helloWorld.exe,編譯完之後多出了helloWorld.exe,並且執行起來正常

了解編譯器之後,我們會發現可以編譯程式碼了,但是當我們有大一點點規模的專案的時候,用csc實在太不方便了。更別說我們有時候要用Debug模式編譯,有時候要用Release模式編譯,有時候要 整個rebuild - 這些如果都自己下csc指令來達到會瘋掉,而且又不能在專案之間共用。工程師懶是一種美德,這個時候就有build tool的出現,而VS就是使用了MSBuild這個build tool 來建制專案。

什麼是Build Tool

Build Tool 就是透過設定Task,然後執行這些Task達到編譯程式碼的工具

通常來說build tool的task是有相依性,例如Task A 只有在 Task B執行之後才能夠做,透過把編譯需要做的事情包成一個一個的Task,然後透過這種相依性關係,達到執行起來整體是一個chain。

build tool的task的設定有些是參數化的,因此像是要用debug模式還是release模式其實只是一個參數不同,但是其他都一樣的動作。

Visual Studio預設所使用的Build Tool就是MSBuild,而MSBuild是一個xml base的build工具。

當我們用記事本打開那些solution或者csproj的時候就會發現,其實整個檔案是xml格式,而那些就是在定義MSBuild所看得懂的參數,當VS要執行build的時候,就依照這個csproj的定義去執行 應該的動作。

到底應該用什麼build tool?

說實話,build tool實在太多了,從VS預設用的MSBuild,到JS base的gulp,到java的gradle,到用F#寫的FAKE和C#的CAKE,到我們將來會用的用PowerShell寫的Psake,是在是太多了。

到底應該用什麼基本上取決於團隊,不過有幾個點可以考慮:

  • 這個build tool需不需要額外安裝什麼?要考慮我的build應該要在任何地方都能夠執行,越少這種OS的dependency越好
  • 這個build tool用的多不多?也就是eco system好不好 - 這樣很多網路上範例都可以直接拿來用
  • 這個build tool好不好寫?符不符合習慣 - build tool最終是要給人用的,好不好用,用不用的習慣非常重要

為什麼不直接用MSBuild?

從上述幾個考量點,會發現,MSBuild既然VS預設就用,那應該和popular,範例應該也很多,那為什麼還要考慮其他的build tool?

其實原因有兩個:

  1. MSBuild是xml base - xml字定義task的時候看起來很繁瑣,明明很簡單的東西定義起來很費勁,看又不容易看
  2. 相較於我們會用的psake(powershell),MSBuild原本的視野有點狹隘,他關注於建制.net的東西,但是隨著前端興起,隨著我們要自動化的東西越多,MSBuild不是做不到,而是 做起來比較麻煩。反過來來看PowerShell,本身就是為了讓MIS能夠腳本化達到自動化的工具,很多Windows東西都可以透過PowerShell來設定,因此決定使用psake。

psake到底是什麼?

說了那麼多,希望對build tool有點概念(就算沒有,等到我們進入實作的時候都會明朗),那接下來就介紹我們之後會使用到的工具psake。

psake是一個powershell的module,所以基本上在撰寫psake的task設定的時候,整個powershell的能力我們都能用到(換句話說包含整個.Net Framework我們都能用到)。

psake的唸法和日語的清酒sake是一樣的。

psake的好處有:

  1. 我們是建制.Net專案,所以建制的機器都在Windows上面(這邊不考慮.Net Core) - windows 7 之後一定有powershell,所以基本上要使用psake不用裝什麼(除了psake module)
  2. 因為psake只是powershell的module,整個powershell的平台功能都能使用,換句話說網路上任何powershell有關的資源都能用 - 要知道powershell建立的目的是為了讓MIS和工程師 不用每一次為了一些小功能就要開發一個console程式的平台
  3. 可以藉著了解psake了解powershell的能力 - 相信大部分工程師都不太用powershell,但是其實他功能很強大,很多windows設定都能夠透過powershell來達到 - 很多功能也都可以透過 寫powershell script把日常自動化 - 像我日常用git就是用powershell的module posh-git - 所以powershell其實都最好了解一下

結語

希望這篇能夠讓大家了解到什麼是build tool,和怎麼選擇一個build tool。

這幾天的理論相信大家一定都煩了,接下來開始我們將會進入到實際操作的部分。

在下一篇,我們會先了解怎麼使用psake,未來的demo code的架構會如何等。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus