NuGet

架設NuPeek Symbol & NuGet Server

首先到Bitbucket下載NuPeek的原始碼回來 https://bitbucket.org/thinkbeforecoding/nupeek [![](http://2.bp.blogspot.com/-oQRiidn7woQ/VcRUEOkTHzI/AAAAAAAACYs/6-EfBRJj5dk/s1600/01.%25E5%25AE%2598%25E7%25B6%25B2%25E4%25B8%258B%25E8%25BC%2589.png)](http://2.bp.blogspot.com/-oQRiidn7woQ/VcRUEOkTHzI/AAAAAAAACYs/6-EfBRJj5dk/s1600/01.%25E5%25AE%2598%25E7%25B6%25B2%25E4%25B8%258B%25E8%25BC%2589.png) 打開專案後,記得先改一下Symbols資料夾的名稱,不然會卡住 [![](http://2.bp.blogspot.com/-PR8hHSy2T8k/VcRUELObHvI/AAAAAAAACYk/3nHRJakSjWI/s1600/02.%25E6%259B%25B4%25E5%2590%258D%25E8%25B3%2587%25E6%2596%2599%25E5%25A4%25BE.png)](http://2.bp.blogspot.com/-PR8hHSy2T8k/VcRUELObHvI/AAAAAAAACYk/3nHRJakSjWI/s1600/02.%25E6%259B%25B4%25E5%2590%258D%25E8%25B3%2587%25E6%2596%2599%25E5%25A4%25BE.png) web.config中,也要把symbolsPath的值改成修改後的名稱 [![](http://1.bp.blogspot.com/-SE4iQc3tiRk/VcRUEOVlHII/AAAAAAAACYo/iyVluHcVMbs/s1600/03.%25E6%259B%25B4%25E6%2594%25B9%25E8%25A8%25AD%25E5%25AE%259A%25E6%25AA%2594.png)](http://1.bp.blogspot.com/-SE4iQc3tiRk/VcRUEOVlHII/AAAAAAAACYo/iyVluHcVMbs/s1600/03.%25E6%259B%25B4%25E6%2594%25B9%25E8%25A8%25AD%25E5%25AE%259A%25E6%25AA%2594.png) 佈署的Server後,首頁會有相關的資訊 [![](http://1.bp.blogspot.com/-N2dx5rrJZoA/VcRUEg5yZvI/AAAAAAAACYw/3ngpW204hMU/s1600/04.%25E9%25A6%2596%25E9%25A0%2581.png)](http://1.bp.blogspot.com/-N2dx5rrJZoA/VcRUEg5yZvI/AAAAAAAACYw/3ngpW204hMU/s1600/04.%25E9%25A6%2596%25E9%25A0%2581.png) 在Visual Studio中的工具->選項->偵錯->一般,改用來源伺服器支援 [![](http://2.bp.blogspot.com/-2E822hTBCzA/VcRUEyZbAUI/AAAAAAAACY8/63nyAVu3Oqw/s1600/05.%25E4%25BE%2586%25E6%25BA%2590%25E4%25BC%25BA%25E6%259C%258D%25E5%2599%25A8.png)](http://2.bp.blogspot.com/-2E822hTBCzA/VcRUEyZbAUI/AAAAAAAACY8/63nyAVu3Oqw/s1600/05.%25E4%25BE%2586%25E6%25BA%2590%25E4%25BC%25BA%25E6%259C%258D%25E5%2599%25A8.png) 在Visual Studio中的工具->選項->偵錯->符號,新增SymbolServer位置 [![](http://1.bp.blogspot.com/-171ZsRPe9fA/VcRUE5-ZggI/AAAAAAAACY4/r4f_T4B9vko/s1600/06.%25E8%25A8%25AD%25E5%25AE%259Asymbol.png)](http://1.bp.blogspot.com/-171ZsRPe9fA/VcRUE5-ZggI/AAAAAAAACY4/r4f_T4B9vko/s1600/06.%25E8%25A8%25AD%25E5%25AE%259Asymbol.png) Symbol推送到NuPeek後,在程式碼中下個中斷點 [![](http://1.bp.blogspot.com/-tjJyCp9Z_Y0/VcRUFN0nfJI/AAAAAAAACZA/CsERo4TzUNs/s1600/07.%25E4%25B8%25AD%25E6%2596%25B7%25E9%25BB%259E.png)](http://1.bp.blogspot.com/-tjJyCp9Z_Y0/VcRUFN0nfJI/AAAAAAAACZA/CsERo4TzUNs/s1600/07.%25E4%25B8%25AD%25E6%2596%25B7%25E9%25BB%259E.png) 透過Fillder可以看到下載Symbol符號和Source 符號快取資料夾中也可以看到下載的資料 [![](http://1.bp.blogspot.com/-YoZEmEC8L_M/VcRUFr50hMI/AAAAAAAACZE/r4Cm7K-fVFE/s1600/08.%25E4%25B8%258B%25E8%25BC%2589%25E7%25AC%25A6%25E8%2599%259F.png)](http://1.bp.blogspot.com/-YoZEmEC8L_M/VcRUFr50hMI/AAAAAAAACZE/r4Cm7K-fVFE/s1600/08.%25E4%25B8%258B%25E8%25BC%2589%25E7%25AC%25A6%25E8%2599%259F.png) F11進入函式後,可以看到符號的Source是在符號快取資料夾中取得 [!


NLog.Elmah

NLog.Elmah套件,是用來擴充NLog的Target,可以寫到Elmah去 Elmah的用法可以參考之前的筆記 在設定好Elmah之後,開始來安裝NLog.Elmah 首先透過NuGet來安裝套件 [![](http://3.bp.blogspot.com/-7-Ra6YAOsCg/VBqk41izCYI/AAAAAAAABmI/cfGfIw-fulU/s1600/01.%E5%AE%89%E8%A3%9D%E5%A5%97%E4%BB%B6.png)](http://3.bp.blogspot.com/-7-Ra6YAOsCg/VBqk41izCYI/AAAAAAAABmI/cfGfIw-fulU/s1600/01.%E5%AE%89%E8%A3%9D%E5%A5%97%E4%BB%B6.png) 再來設定NLog來套用Elmah 主要是透過extensions來引用NLog.Elmah這個Assembly 就可以透過Elmah這個Target,把Log寫到Elmah去 <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> &lt;extensions&gt; &lt;add assembly="NLog.Elmah"/&gt; &lt;/extensions&gt; &lt;targets&gt; &lt;target xsi:type="Elmah" name="elmah" layout="${longdate} ${uppercase:${level}} ${message}"/&gt; &lt;/targets&gt; &lt;rules&gt; &lt;logger name="*" minlevel="Trace" writeTo="elmah" /&gt; &lt;/rules&gt; </nlog> 就可以在elmah中看到寫出的記錄,只是沒有Type,HttpStatusCode也都是0 [![](http://2.bp.blogspot.com/-IlyVebdJVBw/VBqmnO3VBJI/AAAAAAAABmU/MfcOlbctXZQ/s1600/02.%E5%AF%AB%E5%87%BA.png)](http://2.bp.blogspot.com/-IlyVebdJVBw/VBqmnO3VBJI/AAAAAAAABmU/MfcOlbctXZQ/s1600/02.%E5%AF%AB%E5%87%BA.png) 如果加上LogLevelAsType="true"這個屬性 <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true"> &lt;extensions&gt; &lt;add assembly="NLog.Elmah"/&gt; &lt;/extensions&gt; &lt;targets&gt; &lt;target xsi:type="Elmah" name="elmah" LogLevelAsType="true" layout="${longdate} ${uppercase:${level}} ${message}"/&gt; &lt;/targets&gt; &lt;rules&gt; &lt;logger name="*" minlevel="Trace" writeTo="elmah" /&gt; &lt;/rules&gt; </nlog>


Select2 套件基本用法

Select2 套件是一個加強下拉選單的套件,官網提供了許多詳細的示範 這裡用一個簡單的例子來介紹這個套件 首先開一個Web專案 [![](http://3.bp.blogspot.com/--1rBcMtW1Y0/U_bkynIQwNI/AAAAAAAABic/OlnDplvnK8I/s1600/01.%E9%96%8B%E5%B0%88%E6%A1%88.png)](http://3.bp.blogspot.com/--1rBcMtW1Y0/U_bkynIQwNI/AAAAAAAABic/OlnDplvnK8I/s1600/01.%E9%96%8B%E5%B0%88%E6%A1%88.png) 用一個html頁面來練習 [![](http://2.bp.blogspot.com/-ToVRuf067nQ/U_bk416LpLI/AAAAAAAABik/Nsn2uLwtv3E/s1600/02.%E6%96%B0%E5%A2%9E%E9%A0%81%E9%9D%A2.png)](http://2.bp.blogspot.com/-ToVRuf067nQ/U_bk416LpLI/AAAAAAAABik/Nsn2uLwtv3E/s1600/02.%E6%96%B0%E5%A2%9E%E9%A0%81%E9%9D%A2.png) 透過NuGet新增select2.js套件 [![](http://1.bp.blogspot.com/-LsOCKW5DqQc/U_bk_S6qg0I/AAAAAAAABis/y5G7T6NOi9U/s1600/03.select2%E5%A5%97%E4%BB%B6.png)](http://1.bp.blogspot.com/-LsOCKW5DqQc/U_bk_S6qg0I/AAAAAAAABis/y5G7T6NOi9U/s1600/03.select2%E5%A5%97%E4%BB%B6.png) select2.js套件包含了CSS和JavaScript和語系 [![](http://4.bp.blogspot.com/-Hy2TdLfmd7s/U_blD22Tm9I/AAAAAAAABi0/vvZC8707Vl4/s1600/04.%E6%AA%94%E6%A1%88%E7%B5%90%E6%A7%8B.png)](http://4.bp.blogspot.com/-Hy2TdLfmd7s/U_blD22Tm9I/AAAAAAAABi0/vvZC8707Vl4/s1600/04.%E6%AA%94%E6%A1%88%E7%B5%90%E6%A7%8B.png) 在html裡面引用CSS和JavaScript,該套件相依於JQuery,最低版本1.7以上 [![](http://4.bp.blogspot.com/-lKdMrr5EHxA/U_blHcBAGQI/AAAAAAAABi8/9EF63xjvhCc/s1600/05.%E5%BC%95%E5%85%A5%E6%AA%94%E6%A1%88.png)](http://4.bp.blogspot.com/-lKdMrr5EHxA/U_blHcBAGQI/AAAAAAAABi8/9EF63xjvhCc/s1600/05.%E5%BC%95%E5%85%A5%E6%AA%94%E6%A1%88.png) 手動輸入一個下拉選單 [![](http://1.bp.blogspot.com/-pz9TUisEjcc/U_blLbXR6jI/AAAAAAAABjE/4VypAffM6h8/s1600/06.%E5%8A%A0%E5%85%A5%E4%B8%8B%E6%8B%89%E9%81%B8%E5%96%AE.png)](http://1.bp.blogspot.com/-pz9TUisEjcc/U_blLbXR6jI/AAAAAAAABjE/4VypAffM6h8/s1600/06.%E5%8A%A0%E5%85%A5%E4%B8%8B%E6%8B%89%E9%81%B8%E5%96%AE.png) 一般的下拉選單看起來像這個樣子 [![](http://3.bp.blogspot.com/-rXD3i6ufPks/U_blO9ka_eI/AAAAAAAABjM/WNgZSkYrBF4/s1600/07.%E4%B8%8B%E6%8B%89%E9%81%B8%E5%96%AE%E7%9A%84%E6%A8%A3%E5%AD%90.png)](http://3.bp.blogspot.com/-rXD3i6ufPks/U_blO9ka_eI/AAAAAAAABjM/WNgZSkYrBF4/s1600/07.%E4%B8%8B%E6%8B%89%E9%81%B8%E5%96%AE%E7%9A%84%E6%A8%A3%E5%AD%90.png) 透過JQuery啟用select2 [![](http://4.bp.blogspot.com/-GBLzgQcd89M/U_blSWWuvlI/AAAAAAAABjU/KBZSwC8Jd2o/s1600/08.%E5%8A%A0%E5%85%A5JQuery.png)](http://4.bp.blogspot.com/-GBLzgQcd89M/U_blSWWuvlI/AAAAAAAABjU/KBZSwC8Jd2o/s1600/08.%E5%8A%A0%E5%85%A5JQuery.png) 看起來漂亮多了,而已還有查詢過濾的功能 [![](http://1.bp.blogspot.com/-EoqcBDY_4Ho/U_blWRJoSyI/AAAAAAAABjc/xnp3Qs6hpmg/s1600/09.%E5%A5%97%E4%BB%B6select2%E7%9A%84%E6%A8%A3%E5%AD%90.png)](http://1.bp.blogspot.com/-EoqcBDY_4Ho/U_blWRJoSyI/AAAAAAAABjc/xnp3Qs6hpmg/s1600/09.%E5%A5%97%E4%BB%B6select2%E7%9A%84%E6%A8%A3%E5%AD%90.png) 加入多選屬性 [![](http://3.bp.blogspot.com/-BRgdJ_TQ1lI/U_blaO3szHI/AAAAAAAABjk/reLmSAgoFe0/s1600/10.%E5%8A%A0%E5%85%A5%E5%A4%9A%E9%81%B8.png)](http://3.bp.blogspot.com/-BRgdJ_TQ1lI/U_blaO3szHI/AAAAAAAABjk/reLmSAgoFe0/s1600/10.%E5%8A%A0%E5%85%A5%E5%A4%9A%E9%81%B8.png) Select2套件的多選功能 [![](http://1.bp.blogspot.com/-5tm6ArFLpfI/U_bld8UpKyI/AAAAAAAABjs/Nha7t2csK6M/s1600/11.%E5%A4%9A%E9%81%B8%E7%9A%84%E6%A8%A3%E5%AD%90.png)](http://1.bp.blogspot.com/-5tm6ArFLpfI/U_bld8UpKyI/AAAAAAAABjs/Nha7t2csK6M/s1600/11.%E5%A4%9A%E9%81%B8%E7%9A%84%E6%A8%A3%E5%AD%90.png) 參考資料 Select2 官網 Select 2 CDN Select2 Bootstrap 3 CSS


NuGet Multiple Framework 建置

NuGet使用一段時間之後,開始碰到共用的元件,在不同專案的Framework版本不同,會有引用上的困擾,在網路上找了幾個解決方案,實作之後個人覺的比較簡單的方法如下 Step1 每個版本建立一個方案檔 一般專案的命名為net20、net35、net40、net45… 其他類型的專案則再加上縮寫 Client Profile(client) WindowsPhone(wp) Silverlight(sl) CompactFramework(cf) 更多完整的資料請參考官網文件 http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package [![](http://3.bp.blogspot.com/-Z_7Nwh3E004/Urj3_IOzGmI/AAAAAAAAA3Q/JSdtbB7ne1Q/s1600/01.sln.png)](http://3.bp.blogspot.com/-Z_7Nwh3E004/Urj3_IOzGmI/AAAAAAAAA3Q/JSdtbB7ne1Q/s1600/01.sln.png)[![](http://2.bp.blogspot.com/-w46datk00Fw/Urj4AWcam2I/AAAAAAAAA3Y/A-GmHxGvsY0/s1600/02.sln.png)](http://2.bp.blogspot.com/-w46datk00Fw/Urj4AWcam2I/AAAAAAAAA3Y/A-GmHxGvsY0/s1600/02.sln.png)Step2 每一個版本建立一個專案檔[![](http://1.bp.blogspot.com/-GcIzkWZiGz0/Urj4QuT3lII/AAAAAAAAA3c/IbIp_s_gt8g/s1600/03.csproj.png)](http://1.bp.blogspot.com/-GcIzkWZiGz0/Urj4QuT3lII/AAAAAAAAA3c/IbIp_s_gt8g/s1600/03.csproj.png) [![](http://3.bp.blogspot.com/-wPPOHszWFcA/Urj4RmcGNvI/AAAAAAAAA3o/XBtd2ATXs14/s1600/04.csproj.png)](http://3.bp.blogspot.com/-wPPOHszWFcA/Urj4RmcGNvI/AAAAAAAAA3o/XBtd2ATXs14/s1600/04.csproj.png) Step3 每一個專案檔選擇不同的Framework,以及條件式編譯符號和修改輸出路徑 **注意每個組態都要設定喔 **[![](http://2.bp.blogspot.com/-B84By-NaVHE/Urj4ZL6TGpI/AAAAAAAAA3s/mZLbwfLGEHw/s1600/05.version.png)](http://2.bp.blogspot.com/-B84By-NaVHE/Urj4ZL6TGpI/AAAAAAAAA3s/mZLbwfLGEHw/s1600/05.version.png)[![](http://2.bp.blogspot.com/-9Ka8GNPihf0/Urj4abt1ZLI/AAAAAAAAA34/jRp00XFmLv8/s1600/06.output.png)](http://2.bp.blogspot.com/-9Ka8GNPihf0/Urj4abt1ZLI/AAAAAAAAA34/jRp00XFmLv8/s1600/06.output.png)Step4 依Framework版本,加上條件式編譯 using System; using System.Collections.Generic; #if NET35 || NET40 || NET45 using System.Linq; #endif using System.Text; #if NET40 || NET45 using System.Threading.Tasks; #endif namespace ClassLibrary1 { public class Class1 { } } Step5 手動建立nuget spec檔 [![](http://2.bp.blogspot.com/-_JkzDLOeeJc/Urj4jGQfcnI/AAAAAAAAA38/nPBreRhuDJA/s1600/07.spec.png)](http://2.bp.blogspot.com/-_JkzDLOeeJc/Urj4jGQfcnI/AAAAAAAAA38/nPBreRhuDJA/s1600/07.spec.png)<?xml version="1.0"?> <package > <metadata> <id>ClassLibrary1</id> <version>1.0.0</version> <authors>xian</authors> <owners>xian</owners> <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl> <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl> <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>Package description</description> <releaseNotes>Summary of changes made in this release of the package.


TeamCity 建置前先還原NuGet套件

當專案開始使用NuGet來管理套件時,預設套件會安裝在方案檔所在目錄的packages資料夾下 ](http://1.bp.blogspot.com/-Fb-XAssHj4w/UKJTn5RDetI/AAAAAAAAAbc/0mO3150CpWQ/s1600/01.Packages.png) 一般不會把這個套件這個資料夾加入原始檔控制以節省空間,而會在Vistual Studio中啟用套件還原 在方案檔上按右鍵就會看到這個選項了 ](http://1.bp.blogspot.com/-dyZVt873N58/UKJTobl3ClI/AAAAAAAAAbk/NhajJ3Li0bg/s1600/02.PackageRestore.png) 按下後會有一個提示訊息,主要是會新增一個方案資料夾的提示 ](http://2.bp.blogspot.com/-6K_7ZRaH-U0/UKJTo96X_eI/AAAAAAAAAbs/F67Lyeec0TM/s1600/03.AlertMsg.png) 按下是(Y)之前,就會多出一個.nuget的方案資料夾 ](http://4.bp.blogspot.com/-y91qsRmScLI/UKJTpo9UQUI/AAAAAAAAAb0/6o_pDPgV6-A/s1600/04.NuGetDir.png) 還要允許NuGet在建置期間下載遺漏的套件 ](http://1.bp.blogspot.com/-HcrmcbS0_2c/UKJTqBojMQI/AAAAAAAAAb8/twadrgujphw/s1600/05.AllowDownload.png) 把.nuget這個方案資料夾加入Source Control ](http://4.bp.blogspot.com/-rGNsuEcMug8/UKJTqeyIARI/AAAAAAAAAcE/X_gwllNs14o/s1600/06.NuGetSVNDir.png) 先在TeamCity中安裝NuGet Command Line工具 ](http://2.bp.blogspot.com/-D5zrJvyfRKE/UKJTq18pInI/AAAAAAAAAcM/ikPaGWFbePw/s1600/07.AddNuGetExe.png) 新增一個Build Step,選擇NuGet Installer 選擇NuGet的版本,和輸入NuGet的來源 如果使用的套件是從NuGet官網來的,那直接保持空白 如果會使用其他來源的套件,就要在此輸入網址 再輸入方案檔的相對路徑就行了 ](http://1.bp.blogspot.com/--zcz92kuTII/UKJTrZfOVWI/AAAAAAAAAcU/VjDyBdBpBLU/s1600/08.PreInstall.png) 再來要把NuGet Install這個動作,放到編譯之前 所以按一下Reorder build steps,然後用拖曳的方式調整步驟後按Apply ](http://2.bp.blogspot.com/-3BcMkxmRzyc/UKJTsEam9hI/AAAAAAAAAcc/Uj9RBGmTYP8/s1600/09.ReOrderStep.png) 再次建置就成功了 ](http://3.bp.blogspot.com/-hTTzcZcJpos/UKJTtmr7FLI/AAAAAAAAAck/MQKYRgqxUJ0/s1600/10.BuildSuccess.png)


NuGet Spec格式

套件的.nuspec檔案,預設是包括這些內容 <?xml version=”1.0”?> <package > <metadata> <id>$id$</id> <version>$version$</version> <title>$title$</title> <authors>$author$</authors> <owners>$author$</owners> <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl> <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl> <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>$description$</description> <releaseNotes>Summary of changes made in this release of the package.</releaseNotes> <copyright>Copyright 2012</copyright> <tags>Tag1 Tag2</tags> </metadata> </package> $id對應的是這個套件的檔名 $version$對應的是AssemblyInfo.cs中的AssemblyVersionAttribute $author$對應的是AssemblyInfo.cs中的AssemblyCompanyAttribute $description$對應的是AssemblyInfo.cs中的AssemblyDescriptionAttribute $title是套件的顯示名稱 requireLicenseAcceptance是安裝的時後要不要跳授權對話方塊 $licenseUrl是使用條款的網址 $projectUrl是專案資訊的網址 $iconUrl是套件icon的網址 除了這幾個用來設定套件資訊的項目之外,還可以在這個檔案中包含相依性 例如要在這個套件中,使用到log4net套件,那只要加一行dependencies資料就行了 <dependencies> <dependency id=”log4net” version=”2.0.0” /> </dependencies> 除了相依性,還可以指定GAC裡面的Assembly,例如System.ServiceModel <frameworkAssemblies> <frameworkAssembly assemblyName=”System.ServiceModel” targetFramework=”net40” /> </frameworkAssemblies> 如果要額外打包檔案的話,就要用files這個tag了 src指定檔案所在的相對路徑,target指定檔案在套件中的位置 也可以萬用字元和exclude來排除特定檔案 <files> <file src=”bin\Debug*.dll” target=”lib” /> <file src=”bin\Debug*.pdb” target=”lib” /> <file src=”tools*\.