文章出處

自從XRE改名為DNX至今,從來沒有在Mac OS X上成功編譯過DNX。一直很納悶,難道DNX的開發人員不用Mac?今天突然明白了,DNX的開發人員真的不用Mac。而且DNX用的2個持續集成服務AppVeyor與Travis,一個是Windows環境,一個是Linux環境,就是沒有Mac OS X環境。

看來不能指望DNX的開發人員短期內解決這個問題了,只能自己動手。

編譯的錯誤信息如下(編譯命令./build.sh):

Restore complete, 725ms elapsed
info: Target initialize
info: Target build-managed-projects
info: Exec
info:   program: kpm
info:   commandline: pack src/dnx.host --configuration Debug
info:   workingdir: /git/dotnet/dnx
warn: ApplicationName='kpm', CommandLine='pack src/dnx.host --configuration Debug', CurrentDirectory='/git/dotnet/dnx', Native error= Cannot find the specified file
verbose: Stack trace: 
  at System.Diagnostics.Process.Start_noshell (System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process process) [0x00000] in :0

從錯誤信息看,是找不到kpm引起的,kpm不是改名為dnu了嗎?怎么還在找kpm?

打開build.sh文件一看,編譯實際使用的命令是:

mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@"

Sake是一個在ASP.NET vNext時期臨時開發出來的.NET跨平臺構建工具(目測會被跨平臺的msbuild取代),目前DNX的編譯還是借助于Sake。

打開packages/KoreBuild/build文件夾,發現其中有三個與kpm相關的文件:

_kpm-build.shade,_kpm-pack.shade,_kpm-publish.shade

打開一看,文件中的確調用了kpm命令:

exec program='cmd' commandline='/C kpm pack${pack_options} ${projectFolder} --configuration ${configuration}' if='!IsMono'
exec program='kpm' commandline='pack${pack_options} ${projectFolder} --configuration ${configuration}' if='IsMono'

于是,將kpm改為dnu:

exec program='cmd' commandline='/C dnu build${build_options} ${projectFolder} --configuration ${configuration}' if='!IsMono'
exec program='dnu' commandline='build${build_options} ${projectFolder} --configuration ${configuration}' if='IsMono'

改過之后,重新build,之前的錯誤消失了,原來是改名惹的禍!

但是出現了新的錯誤:

System.Net.WebException: Error: SendFailure (The object was used after being disposed.) 
---> System.ObjectDisposedException: The object was used after being disposed.
  at System.Net.WebConnection.BeginWrite (System.Net.HttpWebRequest request, System.Byte[] buffer, Int32 offset, 
Int32 size, System.AsyncCallback cb, System.Object state) [0x00000] in <filename unknown>:0

后來在DNX的Issue(Fail to build using dnu build)中得知,這是Mono 4.0.1的bug引起的。

于是,只能等Mono修復這個bug,才能繼續嘗試在Mac上編譯DNX。

5月12日更新1:Mono已經修復了這個bug,詳見 Bug 29499 - System.IO.EndOfStreamException when running dnx command

5月12日更新2:參考Compiling Mono on Mac OS X,簽出最新的mono源代碼進行編譯/安裝,安裝之后重新進行DNX的build,這次終于build成功了!


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()