只有累積,沒有奇蹟

2018年11月29日 星期四

[.NET] Web API找不到 bin 底下的 roslyn csc.exe ?

發生情境
從版控 Git 上抓下新專案要進行建置時,發生建置失敗的事件錯誤訊息如下
Could not find a part of the path 'D:\git\projectName\bin\roslyn\csc.exe'.
從建置失敗的錯誤訊息中可以很清楚看到失敗是因為 bin 底下少 roslyn\csc.exe 檔案,之前也遇過類似的案例在此簡單記錄一下遇到這問題時該如何處理

甚麼是 Roslyn ? 
Roslyn 是 C# 之父在 //Build/ 2014 公布的 .NET Compiler Platform (Open Source)可以協助分析程式碼的語法(syntax)、語意(semantics)等等今天不是在介紹新一代編譯平台詳細可以參考 Roslyn 平台介紹,重點是為什麼 Roslyn 跟這有關係呢 ? 在 .Net Framework 4.5.2 使用 Visual Studio 2015 建立專案,預設會使用 Roslyn 進行編譯的動作,稍微整理一下有以下幾種方式可以解決

刪除 Roslyn
如果確認專案中不需要使用到 Roslyn,可以透過 Nuget 刪除它
- 開啟Nuget Console,輸入以下指令
PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers

在 MSBuild 設定
專案檔設定 AfterBuild 事件
<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild" Condition="!$(Disable_CopyWebApplication) And '$(OutDir)' != '$(OutputPath)'">
    <ItemGroup>
      <RoslynFiles Include="$(CscToolPath)\*" />
    </ItemGroup>
    <MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
    <Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>

Rebuild
在專案建置 > 按下重新建置,即可解決此問題

後記
自己解法都是很直覺無腦的去其他專案 copy roslyn 資料夾後再建置一次就成功了,但方法太爛就不列在上面丟臉了 XDD

參考
could-not-find-a-part-of-the-path-bin-roslyn-csc-exe
找不到 roslyn\csc.exe ?!

2018年11月23日 星期五

[Nuget] Nuget operation failed

前言
    為了取得/建置專案的方便,最近常遇到同事透過 powershell 指令使用svn取得最新的代碼並呼叫MSBuild自動建置專案,今天在執行完前同事所撰寫的 powershell script 後開啟專案跳出 Nuget operation failed 提示訊提,這種情況還是第一次遇到,新筆電與桌基平常都正常來記錄處理臭蟲的過程
症狀
  • 開啟Visual Studio 2017跳出錯誤訊息:Nuget operation failed,如下圖所示

  • 按下專案建置或重build一直無法順利建置成功,大部分錯誤訊息是 Nuget Package restone fail

  • Nuget Package Source 清單為空白 : 打開 Nuget Package Manager 加入新的Source,詭異的是新增source按下儲存還是無法加入,不管怎麼 add 都是空白的


處理方式

從症況來看是Visual Studio讀取 Nuget config異常無法順利,進行下列資訊確認
  1. 確認其他專案是否有此狀況 : 其他專案皆沒有此問題,只有這專案 Nuget loading時fail,因此懷疑是此專案 Nuget config問題,進行異常專案Nuget.Config的確認
    補充 : Nuget package source list 存放位置在 C:\Users\{yourName}\AppData\Roaming\NuGet
  2. 檢查專案 Nuget.config 設定 :  發現讀取來源與專案不同位置專案在 D槽 設定檔讀 C槽 (老天鵝! 實在太神奇了),因此在Visual Studio開啟時loading 不到正確的package source data,因此跳出Nuget operation failed錯誤訊息,將專案 nuget.config 指到正確目錄即可正常
  3. 重開讓 Visual Studio 讀取正確的 Nuget 設定檔,打完收工 !!

2018年11月17日 星期六

[Git] Username and Email must be set before commit

發生情境

最近在新筆電安裝開發常用的軟體,安裝完Tortoise GIT版小烏龜之後無法 commit code 錯誤訊息如下 : 
    User name and email must be set before commit. Do you want to set these now ?    

這訊息與登入憑證 (login credentials) 無關,在 Git 要進行 Commit 的動作時需要一併提交 Name 和 eMail 等資訊這狀況遇過好多次,但每次都跳過直接 google 該怎麼解決,事不過三這次就把它紀錄下來方便下次換電腦時遇到使用(是要換幾次工作 咦?),以下提供兩種解決方式

透過指令設定 Name & Email  

1. 開啟Command Line (cmd)
2. 輸入下列指令設定 Name & Email

  • git config --global user.name "Your Name"
  • git config --global user.email "Your Email"


透過介面設定  

1. 開啟小烏龜 > Settings
2. User Info 區域修改你所要設定的 Name & Email


3. 輸入完畢按下套用,打完收工


參考

https://stackoverflow.com/questions/21049090/just-starting-with-tortoisegit-why-does-it-need-my-email-for-a-local-repository


2018年11月13日 星期二

[typescript] 如何得知 Visual Studio 使用 Typescript 的版本?

前言
近期工作都在使用 Typescript 進行開發,要如何得知目前Typescript 版本呢? 

取得目前版本方法
Visual Studio 2017 
  1. 專案按右鍵 > Properties > TypeScript Build Tab > TypeScript Version
    此專案就是使用 2.3 version,如果要修改的話就選要用的版本即可

    注意 : 異動編譯版本有可能部分方法會不支援造成編譯失敗
  2. 暴力修改方式也可以直接到 projectName.csproj 裡面修改 <TypeScriptToolsVersion> 的值,譬如想換成 2.5 版儲存後即設定完成
  3. Developer Command Prompt tool :
    在windows search input  > Developer Command Prompt tool for 2017 > 在console write : tsc -v可取得目前版本

 
Visual Studio 2013

  1. Help > About Microsoft Visual Studio 
  2. Installed products 會顯示目前使用Typescript 版本號

Typescript Compiler Path


Typescript Compiler (tsc.exe) 在安裝時預設位置為 :
C:\Program Files (x86)\Microsoft SDKs\TypeScript
從下圖可以得知,在我電腦目前有1.0, 2.2, 2.3 以及 2.5四種版本

2018年11月10日 星期六

[typescript] 如何在 Visual Studio 2017 安裝 TypeScript 1.8 Compiler ?


前言
最近公司在進行升級 Visual Studio 2017 IDE,有些專案在過去開發時是使用舊的 TypeScript 版本,這篇文章是在記錄如何在 Visual Studio 2017安裝 TypeScript 1.8版 Compiler (預設不會裝) 的過程

釐清案情
專案從版控下載後發現Build不過
,發現錯誤訊息如下圖





錯誤訊息疑似是版本不支援關係
,這時需要查看此專案檔用 TypeScript用到的版本號為 1.8 (專案右鍵 > Properties > TypeScript Build Tab > TypeScript Version),怪異的是版號旁邊出現之前 unavailable 



從上一篇文章可以知道
Typescript Compiler 安裝時預設位置在 Microsoft SDKs\TypeScript 目錄底下,因此進此目錄確認發現此目錄並沒有 1.8 版本的資料夾 








解決過程
  1. 使用 Nuget Package Manager Console 輸入指令安裝 TypeScript 1.8 版本:  
    PM > Install-Package Microsoft.TypeScript.Compiler -Version 1.8.11
    重新 Build 之後發現依然無法成功建置成功,GG斯米達
  2. 請教Google大神發現 TypeScript 1.8 在 Visual Studio 2013 有安裝檔,點擊 下載 連結後進行安裝
  3. 安裝完後在 Build 發現建置正常,Microsoft SDKs\TypeScript 目錄底下也有 1.8 版本的資料夾,打完收工 !!

[C#] Anonymous Type 匿名型別

說明
Anonymous Type 是甚麼?
匿名型別是C# 3.0開始有的特性,是一種暫存型的型別不需要建立額外的類別來存放資料
根據MSDN對於 匿名型別 的說明如下








根據MSDN的說明
整理一下重點及特性
1. 透過 new 建立實體 
// Anonymous Typevar employee = new { Id = 1, Name = "Marcus", Age = 22 } ;
要使用時透過 匿名物件初始設定(anonymous object initializer) 來建立實體不需要先定義employee物件的prop或是屬性
2. 不需要事先明確定義屬性型別





型別名稱會由編譯器產生,我們可以透過物件的object.GetType()方法來取得物件的型別名稱
以上述的例子,將滑鼠移到var上會發現產生的型別名稱為 f__Anonymous0'3

3. 唯讀屬性 






公開且唯讀的屬性(Immutable types)
,屬性設定初始值後,無法再修改

4. 屬性類型由編譯器推斷






在建立匿名型別物件時,其屬性類型會由編譯器自動推斷
以上述的例子,employee.Name與Age在建立時並未定義屬性類型
建立後滑鼠移上去即可發現類型已經自動指定為初始值屬性值類型
Name => String , Age => int

使用場景

匿名型別帶來很多方便的地方有時需要一個簡單的類別來儲存一些簡單的資料但又不想為了簡單的需求另外定義一個類別(沒其他地方用到),這時就可以使用C#的匿名型別,或是資料來源是兩個不同物件或類別,現在需要取得個別的其中一個屬性來做回傳,這時也可以使用匿名型別來產生新的載體,ex 使用LINQ使用進行JOIN後最後Select new 某某屬性減少貧血類別的數量

參考

Huan-Lin 學習筆記: C# 筆記:匿名型別


2018年11月9日 星期五

2018年11月7日 星期三

[IIS] HTTP 錯誤 500.21 - Internal Server Error

前言

換新筆電後在安裝公司專案過程遇到很多問題,昨天是SQL Server服務異常關閉,今天是專案出現問題是"HTTP 錯誤500.21 - Internal Server Error"但這樣也不錯,可以學到更多新知識與問題這裡簡單紀錄一下處理過程

錯誤訊息 HTTP 錯誤 500.21

HTTP Status Code 狀態碼 是Server端 Response 的狀態在 Status Code Definitions 文件中可以看到詳細的說明,在IIS 7.5之後 HTTP 狀態碼可以簡單分為下列幾種

  • 1xx - 資訊
  • 2xx - 成功
  • 3xx - 重新導向
  • 4xx - 用戶端錯誤
  • 5xx - 伺服器錯誤
從Server回傳給瀏覽器的錯誤代碼來看,是屬於伺服器錯誤
其中還有提示可能發生的原因與解決方法主要錯誤訊息為 : 

處理常式 "ExtensionlessUrlHandler-Integrated-4.0" 的模組清單中有錯誤的模組 "ManagedPipelineHandler"
關鍵字提到可能是 
模組錯誤 與 ASP.NET安裝不完全,在看HTTP Status Code 500.21 是 無法識別模組,因此下一步便是比對桌機正常的專案環境與筆電的IIS設定站台的模組設定(Handler Mapping)差異

發現兩台模組設定大不相同,主要是缺少ASP.NET 4.0 相關模組
解決方式打開命令提示字元cmd,執行下列指令

dism /online /enable-feature /featurename:IIS-ASPNET45 /all
會跳出安裝畫面如下圖安裝進度100%後即完成


確認
  1. 重新reload畫面及正常執行
  2. 可以去IIS站台Handler Mapping發現已新增ISAPI 4.0相關模組

參考
IIS 7.0、IIS 7.5 及 IIS 8.0 的 HTTP 狀態碼
aspnet-regiis-exe-ir-does-not-work-on-windows-8

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com