前言
隨着net core rc2的發布,園子里面關於net core的入門文章也也多了起來,但是大多數都是在一個平台上面來寫幾個簡單的例子,或者是在解釋代碼本身,並沒有體現說在一個平台上面創建一個項目,然后通過源碼管理簽出到另一個平台上繼續開發。還有就是一次編譯到處運行是如何體現的?這樣類型的文章好像還沒有在哪里看到過,於是我就想自己來一遍,並把這個過程分享出來給大家。
首先來個官方的介紹:
.NET Core - .NET 使用 .NET Core 跨平台運行
Announcing .NET Core RC2 and .NET Core SDK Preview 1
一、mac os x 上的開發
本來環境安裝是不想寫的,因為有太多的文章,但是不寫的話又感覺少了些什么。然后我只有一個mac和一個安裝win10的pc,所以就只針對這兩個平台來,linux等我有錢買新電腦再來折騰。廢話不多說,下面開始介紹。
mac os x環境下 dotnet core 的安裝
參考鏈接: https://www.microsoft.com/net/core#macosx
首先要先安裝一個 OpenSSL 這個是以后 dotnet core 要下載一些依賴庫什么的會用到的。可以使用 brew 來安裝OpenSSL
打開命令終端輸入brew安裝命令
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install openssl
brew link --force openssl
這兩個東西安裝后,我們就可以來安裝我們我們的core了,下載這么一個安裝包 點擊下載 這是一個pkg安裝包。我現在的時候是 dotnet-dev-osx-x64.1.0.0-preview1-002702.pkg
只要雙擊一下安裝包,然后一直點擊繼續就可以了
安裝完之后可以輸入命令查看dotnet core 有沒有安裝成功
dotnet -v
命令行下的項目建立與運行
安裝完環境后,我們就可以來開始我第一個項目。我們新建一個文件夾叫做LearnDotnetCore
然后打開命令窗口 cd 到這個文件夾下面。然后用命令 dotnet new
來建立初始化一個項目。初始化完后我們看看到文件夾下面多了兩個文件 Program.cs project.json
Program.cs 是c#源碼文件,可以用來實現我們的具體邏輯
project.json 是配置依賴框架,依賴包,版本號,還有其他一些編譯會用到相關的東西。這個作用和nodejs的模式是相類似的。
項目創建完之后需要 dotnet restore
來下載我們配置好的依賴包。下載完后呢文件夾里面多出了一個 project.lock.json 文件,打開來看,可以看到我們下載了那些依賴庫,還有一些編譯的引用等。
下載完依賴庫后,我們可以通過運行命令 dotnet run
來編譯運行我們的程序。
編譯完成后,文件夾內會多出兩個文件夾 bin 和 obj 。
bin 是我們編譯的完成的文件
obj 里面是一些編譯輸出和動態庫連接等的一些信息。
然后運行我們可以看到輸出 Hello World! 到這來,我們的命令行建立、編譯和運行程序就到這來結束了。
使用vscode調試運行
參考鏈接:https://docs.asp.net/en/latest/tutorials/your-first-mac-aspnet.html#running-locally-using-kestrel
單純使用命令行來開發的話,那么肯定是沒有那么方便了,但是在但是目前好像也沒有什么特別好的選,所以我們就使用 Visual Studio Code 然后再安裝一個插件C# extension
還有一個叫做Xamarin Studio.,貌似還沒有支持到 dotnet core的樣子
當然還有一個叫做 Project Rider的東西,之前 net core 用 DNX 命令的時候下載來玩過一下,支持什么的還可以,不過很久沒有玩了,最近一次編譯更新是在 5月17號,也不知道現在支持如何。有興趣的同學自己下載來玩下,內容不在本文章中介紹了。
打開vscode然后把項目的文件夾拖拉到vscode的窗口上面去,會在左邊的工作空間欄目中顯示項目的樹形結構。然后我們選擇project.json,編輯器會提示你是否要加入調試信息,然后我們點擊yes,目錄結構就會多出一個.vscode文件夾里面有兩文件 launch.json 和 tasks.json
然后我們去修改 launch.json 里面的內容,把program里面的內容改成我們編譯完成后的dll路徑,當然有的有時候會給你自動生成好的,不需要自己修改。
"program": "${workspaceRoot}/bin/Debug/netcoreapp1.0/LearnDotnetCore.dll",
還有就是args也修改一下,這個是main函數的傳入值。
"args": ["我試試看傳入了什么"],
修改完后在Program.cs里面加個斷點,接着直接按f5,或者點開debug面板,然后點擊那個調試按鈕開始調試
我們可以看到,一個變量的監視數據,還有就是控制台打印出了 Hello World!
代碼上傳
我選擇了用github來保存代碼,並且在window上通過git下載到vs里面進行繼續開發
首先我們打開git面板來初始化git儲存庫
初始化完后,我們可以看到我們有15個文件要提交,但是我們並不需要把這么多個文件都給提交了,我們只要提交Program.cs project.json 這兩個文件,然后在其他地方下載后來生成其他文件就可以了。
於是,我們就添加了一個.gitignore文件,文件內容添加要排除的東西,然后我們就剩下三個文件提交了
最后,輸入提交的信息然后點擊那個勾符號,就提交到本地的庫里面了。
完成了上面的步驟后,我們還需要把庫同步到github上面去。首先,我們去注冊一個賬戶,然后新建一個repository,建立過程自己摸索,就不寫的那么詳細。建完后如下圖
然后到我們的目錄下輸入下面的兩條命令
git remote add origin https://github.com/kotcmm/LearnDotnetCore.git
git push -u origin master
如果有用戶名密碼,就輸入用戶名密碼,然后存儲庫就同步到了github上面去了。記住地址什么的要改成自己的。
二、window 上的開發
切到win10上面來繼續完成這個博文。
開發環境的安裝
參考資料:https://www.microsoft.com/net/core#windows
首先要先下載下面的工具:
DotNetCore.1.0.0.RC2-VS2015Tools.Preview1
這兩個軟件的安裝就不需要截圖了,先安裝Visual Studio Community 2015再安裝DotNetCore.1.0.0.RC2-VS2015Tools.Preview1。安裝完之后我們打開vs 2015,然后把我們之前在mac上面創建的項目給下載下來。
打vs后我們選擇 open from source control 然后出現左邊的面板,如果沒有登錄你的github賬號,那么就先登錄你的賬號,然后再點擊Clone出現一個窗口選擇我們前面上傳的那個項目。
下載完后雙擊我們的git項目,然后在彈出的窗口里面選擇project.json,就會生成左邊的那樣項目工程了。
然后我們編譯成功並運行起來。
到這里我們已經成功的把在mac上面創建的項目拉到win下不改任何代碼,然后成功編譯運行了。
發布運行
參考資料:兩種部署方式
上面的開發過程中都是直接在id里面運行的,或者用 dotnet run 來直接運行的,那么我們編譯好之后如何脫離IDE來運行呢?
- 我們也可以到編譯成功的目錄 netcoreapp1.0 下面輸入命令 dotnet LearnDotnetCore.dll 來運行我們的程序。
- 可以在project.json加個 runtimes 屬性,然后編譯出一個exe文件,然后直接運行exe。
要編譯成Release的話,可以用命令 dotnet build --configuration Release --no-dependencies --no-incremental 當然build的命令以后可以有單獨的文章來講解
第一種編譯的配置
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-rc2-3002702"
}
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
}
}
}
第二種編譯的配置
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.NETCore.App": {
//"type": "platform",
"version": "1.0.0-rc2-3002702"
}
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
}
},
"runtimes": {
"win10-x64": {},
"osx.10.11-x64": {}
}
}
第二種配置使用dotnet publish會把core的支持運行一起打包處理,然后相關的平台就不用安裝net core,但是不同平台需要不同編譯。具體的效果和目錄結構我就不進行截圖了,有興趣的自己編譯看看。
三、改造成web項目
前面介紹了如何編譯和運行控制台的程序,但是在這個互聯網的時代,我感覺要做成一個web項目可能會更有趣,我們看看如何直接把前面控制台的項目變成web項目。
參考資料:https://docs.asp.net/en/latest/getting-started.html
vs修改運行
首先修改配置 project.json,在屬性dependencies添加Kestrel依賴。
第二添加一個類Startup
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
namespace LearnDotnetCore
{
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(context =>
{
return context.Response.WriteAsync("Hello from ASP.NET Core!");
});
}
}
}
然后修改Program.cs
using System;
using Microsoft.AspNetCore.Hosting;
namespace LearnDotnetCore
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
}
然后點擊運行按鈕,程序成功的運行起來
打開瀏覽器訪問 http://localhost:5000/ 我們可以看到瀏覽器打印出 Hello from ASP.NET Core!證明我們的程序已經編譯並運行成功。
發布並部署iis
雖然說直接運行可以訪問成功,但是有的人就是喜歡部署到IIS上面去,所以這里也嘗試一下部署到IIS上面是什么樣的。
參考資料:https://docs.asp.net/en/latest/publishing/iis.html
安裝完IIS后需要安裝 DotNetCore.1.0.0.RC2-WindowsHosting來支持 net core 在iis上面運行
然后修改project.json的內容,添加下面三個東西,來支持iis運行
然后修改Program.cs,添加iis支持
using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
namespace LearnDotnetCore
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
}
添加文件 web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!--
Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
-->
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
</system.webServer>
</configuration>
上面三個修改完之后,就可以來發布,選擇項目郵件,然后選擇發布會出現一個窗口
輸入名稱,然后next或者直接publish,操作完成后會生成一堆文件。然后到iis里面創建 Web 站點,然后綁定發布目錄就行,應用程序池的模式需要改為“無代碼托管”。
啟動網站運行后,瀏覽器輸入http://localhost/ 可以看到瀏覽器打印出 Hello from ASP.NET Core!和上面沒有在iis里面運行的效果是一樣的。
四、申請vps並上傳項目運行
在文章開頭說了,沒有Linux的系統,但是后來想了一下,還是也體驗一下看看,於是就去 host1plus 買了一個vps,一個是可以體驗一下發布一個net core 做的網站,另一個就是以后還可以放一些運行示例什么的。
我買的vps安裝的是centos-7系統,可以使用ssh遠程登錄上去管理。先給安裝一個 net core 的運行環境。
參考資料:https://www.microsoft.com/net/core#centos
輸入安裝命令:
curl -sSL https://raw.githubusercontent.com/dotnet/cli/rel/1.0.0-preview1/scripts/obtain/dotnet-install.sh | bash /dev/stdin --version 1.0.0-preview1-002702 --install-dir ~/dotnet
結果返回了錯誤。
dotnet_install: Error: Unable to locate libunwind. Install libunwind to continue
dotnet_install: Error: Unable to locate libicu. Install libicu to continue
dotnet_install: Error: Unable to locate gettext. Install gettext to continue
看起來是缺少了幾個玩意,那好吧先來下載安裝,使用yum命令來安裝
yum install libunwind
yum install libicu
yum install gettext
重新輸入安裝命令:
curl -sSL https://raw.githubusercontent.com/dotnet/cli/rel/1.0.0-preview1/scripts/obtain/dotnet-install.sh | bash /dev/stdin --version 1.0.0-preview1-002702 --install-dir ~/dotnet
這次返回的信息是
dotnet-install: Downloading https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/1.0.0-preview1-002702/dotnet-dev-centos-x64.1.0.0-preview1-002702.tar.gz
dotnet-install: Extracting zip
dotnet-install: Adding to current process PATH: /root/dotnet. Note: This change will be visible only when sourcing script.
dotnet-install: Installation finished successfuly.
然后再輸入命令
sudo ln -s ~/dotnet/dotnet /usr/local/bin
說明:ln是linux中又一個非常重要命令,它的功能是為某一個文件在另外一個位置建立一個同步的鏈接.當我們需要在不同的目錄,用到相同的文件時,我們不需要在每一個需要的目錄下都放一個必須相同的文件,我們只要在某個固定的目錄,放上該文件,然后在 其它的目錄下用ln命令鏈接(link)它就可以,不必重復的占用磁盤空間。
然后我們再來輸入 dotnet 命令看看是否真的安裝成功了。安裝成功之后我們就要把之前編譯發布好的文件給上傳到vps上面去。(記住是要上傳 dotnet publish發布出來的那些文件)
可以使用scp命令來上傳,命令參考:http://www.cnblogs.com/peida/archive/2013/03/15/2960802.html
文件上傳成功后我們執行 dotnet LearnDotnetCore.dll 命令來運行我們的網站程序。返回一下信息
Hosting environment: Production
Content root path: /root/www/publish
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
說明我們的程序已經成功運行起來,然后我們打開瀏覽器訪問我們的vps地址,發現並沒打印出信息。那是因為程序默認綁定的是http://localhost:5000, 所以我們訪問ip的是訪問不到,那有兩種辦法可以實現我們使用ip訪問,第一種修改程序添加綁定例如下面:
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseUrls("http://192.168.0.102:5000")
.UseStartup<Startup>()
.Build();
host.Run();
}
第二種可以使用代理,我這里選擇Nginx。安裝參考資料:https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7
由於沒有玩過Linux所以經過幾番波折啊,首先80端口被Apache http占用啟動不了,然后防火牆阻止了80端口。最后終於成功的看到了這個頁面
然后配置代理,找到Nginx里面的配置把location /
改成如下
location / {
# 傳遞真實IP到后端
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass localhost:5000;
}
保存后,重啟一下Nginx,然后再運行我們前面上傳上去的net core網站,再打開瀏覽訪問我們vps的地址,瀏覽器打印出了 Hello from ASP.NET Core!
到這我們已經體驗完成了net core 在 macosx、windows、linux三個平台下的開發和部署運行的過程。本文結束,謝謝觀看。
由於本人水平有限,知識有限,文章難免會有錯誤,歡迎大家指正。如果有什么問題也歡迎大家回復交流。要是你覺得本文還可以,那么點擊一下推薦。