自從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成功了!
文章列表