在Mac OS X Yosemite 10.10.3 中搭建第一個 ASP.NET 5 Web 項目


終於有時間在 Mac 上安裝一下 ASP.NET 5,網上有許多教程,但是多數的時間比較早了,版本不是最新,搭着 Build 2015 的春風,我也實踐一下 Mac OS X 上的 ASP.NET 5。

經常使用 Windows 8.1,對 Mac 並不太熟悉,也一並把安裝中的問題趟一遍。

前幾天剛剛更新了 Mac 的操作系統,操作系統版本 Mac OS X Yosemite 10.10.3。

1. 在 Mac OS X 上安裝 ASP.NET 5

ASP.NET 5 運行在 DNX 之上,DNX 是 .NET 運行環境 ( .NET Execution Environment ) 的簡寫,它支持多種平台,當然包括我們今天的 OS X 了,在 OS X 上,使用 Homebrew 可以很容易安裝 DNX。

1.1 安裝 Hoembrew

什么是 Homebrew? 我們先看看它。

Homebrew 是用來在 Mac OS X 安裝 Linux 工具包最簡單和靈活的方式。官方網址:http://brew.sh

打開 Mac OS 的終端,輸入 ruby 命令

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

就可以了。安裝之后可以檢查是否安裝成功。

brew –v
Homebrew 0.9.5

我現在的版本是 0.9.5

1.2 安裝 DNVM

又一個新的縮寫詞 DNVM,英文的原文是 .NET Version Manager,就是 .NET 版本管理器,包含更新和配置 .NET 運行環境 ( KRE ) 所使用的一系列工具,是 ASP.NET 5 項目的一個子項目。DNVM 的網址:https://github.com/aspnet/dnvm/

 

一旦成功安裝了 Homebrew,就可以使用 brew 命令來安裝這個 DNVM。

brew 自己有默認的倉庫,使用 tap 可以添加第三方的倉庫,我們的 DNVM 就需要設置一下所在的倉庫。

在終端窗口中,使用下面的命令來設置這個第三方的倉庫。

brew tap aspnet/dnx

如果你想更新一下這個倉庫,可以使用下面的命令先刪除原來的,再重新安裝,實現更新的目的。

brew untap aspnet/dnx
brew tap aspnet/dnx

 

更新之后,才可以安裝我們真正需要的 DNVM。現在,可以安裝 .NET 版本管理器了。

在終端中輸入下面的命令,安裝 DNVM。注意大小寫,命令中可是小寫的。這將會自動從 https://www.nuget.org/api/v2 安裝最新的 DNX 包。 

brew install dnvm

終端中的輸出如下所示。

成功安裝之后,可以在終端窗口中執行 dnvm 命令來檢查一下。

dnvm

應該看到如下的輸出。

    ___  _  ___   ____  ___
   / _ \/ |/ / | / /  |/  /
  / // /    /| |/ / /|_/ / 
 /____/_/|_/ |___/_/  /_/  

.NET Version Manager - Version 1.0.0-beta5-10374
By Microsoft Open Technologies, Inc.

DNVM can be used to download versions of the .NET Execution Environment and manage which version you are using.
You can control the URL of the stable and unstable channel by setting the DNX_FEED and DNX_UNSTABLE_FEED variables.

Current feed settings:
Default Stable: https://www.nuget.org/api/v2
Default Unstable: https://www.myget.org/F/aspnetvnext/api/v2
Current Stable Override: <none>
Current Unstable Override: <none>

Use dnvm [help|-h|-help|--help]  to display help text.

如果你看到的是

-bash: dnvm: command not found

也沒有關系,這是因為沒有找到 dnvm 這個命令而已,將 dnvm.sh 加入搜索路徑就可以,這可以通過下面的命令來實現。

source dnvm.sh

如果需要更新 DNX,那么,可以使用 upgrade 命令。

dnvm upgrade

現在,你的 DNX 就已經成功安裝了。使用 dnvm list 可以查看所有的版本。

Active Version              Runtime Arch Location             Alias
------ -------              ------- ---- --------             -----
       1.0.0-beta5-11682    coreclr x64  ~/.dnx/runtimes      
  *    1.0.0-beta4          mono         ~/.dnx/runtimes      default
       1.0.0-beta5-11682    mono         ~/.dnx/runtimes

可以切換當前使用的 .NET 版本。

localhost:helloClr $ dnvm alias default 1.0.0-beta5-11682
Updating alias 'default' to 'dnx-mono.1.0.0-beta5-11682'

重新顯示一下當前的版本。

ocalhost:helloClr $ dnvm list

Active Version              Runtime Arch Location             Alias
------ -------              ------- ---- --------             -----
       1.0.0-beta5-11682    coreclr x64  ~/.dnx/runtimes      
  *    1.0.0-beta4          mono         ~/.dnx/runtimes      
       1.0.0-beta5-11682    mono         ~/.dnx/runtimes      default

1.3 保存路徑

當關閉現在的終端窗口之后,重新打開終端窗口就會發現 dnx 不好用了。這是因為我們使用 source 設置的路徑只能在當前的終端窗口中才能使用,如果希望能夠保存下來,需要修改配置文件了。

查找一下 dnvm.sh 所在的文件夾。

localhost:~ $ mdfind -name dnvm.sh
/usr/local/Cellar/dnvm/1.0.0-dev/libexec/dnvm.sh

 

2. 創建控制台程序

環境創建之后,我們一般都會創建一個控制台的 Hello, world 程序來爽一把,程序就不用說了,主要是環境。

在桌面上創建了一個測試使用的文件夾 helloClr。在這里面創建下面的兩個文件。

使用你喜歡的編輯器寫一個 helloworld.cs 程序,其實與 Windows 下當然是一摸一樣了。

using System;
public class Program {
public static void Main() {
        Console.WriteLine("Hello from DNX!");
    }
}

不一樣的是需要為我們這個簡單的項目,創建一個項目文件,文件名必須是 project.json,是 json 格式呀,不要寫錯了。在與 helloworld.cs 相同的文件夾下,創建這個 project.json 文件。內容如下。

{
  "dependencies": {
  },
  "frameworks": {
    "dnx451": {},
    "dnxcore50": {
      "dependencies": {
        "System.Console": "4.0.0-beta-22605"
        }
} }
}

現在已經一切都准備好了,注意當前目錄需要在這個文件夾下,在終端窗口中,輸入運行的命令就可以了。

dnx . run

沒有問題的話,就應該看到輸出的 Hello from DNX! 了。

在 Mac OS X 下面,還可以設置一個環境變量 DNX_TRACE 來看看詳細的輸出。

export DNX_TRACE=1

現在的輸出豐富多了。

Information: [DefaultHost]: Project path: /Users/haogj/Desktop/helloClr
Information: [DefaultHost]: Project root: /Users/haogj/Desktop/helloClr
Information: [DefaultHost]: Packages path: /Users/haogj/.dnx/packages
Information: [Breadcrumbs] Breadcrumbs for servicing will not be written because the breadcrumbs folder () does not exist.
Information: [DependencyWalker]: Walking dependency graph for 'helloClr DNX,Version=v4.5.1'.
Information: [WalkContext]: Graph walk stage 1 took in 9ms
Information: [DependencyWalker]: Graph walk took 17ms.
Information: [WalkContext]: Populate took 7ms
Information: [DependencyWalker]: Resolved dependencies for helloClr in 26ms
Information: [LoaderContainer]: Load name=helloClr
Information: [ProjectLibraryExportProvider]: GetLibraryExport(helloClr, DNX,Version=v4.5.1, Debug, )
Information: [Microsoft.Framework.Runtime.Roslyn.RoslynProjectReferenceProvider]: GetProjectReference(helloClr, DNX,Version=v4.5.1, Debug, )
Information: [ProjectExportProviderHelper]: Resolving references for 'helloClr' 
Information: [ProjectExportProviderHelper]: Resolved 4 references for 'helloClr' in 6ms
Information: [RoslynCompiler]: Compiling 'helloClr'
Information: [LoaderContainer]: Load name=System.Security.Cryptography.Hashing
Information: [LoaderContainer]: Load name=System.Security.Cryptography.Hashing.Algorithms
Information: [RoslynCompiler]: Compiled 'helloClr' in 373ms
Information: [CompilationContext]: Generating resources for helloClr
Information: [CompilationContext]: Generated resources for helloClr in 3ms
Information: [RoslynProjectReference]: Emitting assembly for helloClr
Warning: PDB generation is not supported on this platform
Information: [RoslynProjectReference]: Emitted helloClr in 827ms
Information: [ProjectAssemblyLoader]: Loaded name=helloClr in 1240ms
Hello from DNX!

查看一下當前目錄,可以看到我們熟悉的 helloworld.exe 文件,當然了,它必須使用 dnx 才能執行,可以這樣直接執行程序。

dnx helloworld.exe

 

3. 創建網站程序

激動人心的時刻快到了,但是,我們還需要做一些准備工作。

先確認一下你的 .NET 版本。還記得下面的命令嗎?檢查默認的版本。

dnvm list

Yeoman 是一個創建項目框架的應用,使用它我們可以創建出網站項目的基本框架。

默認的網站需要很多文件組成,包括樣式、腳本、配置等等,在 Mac 下面可沒有強大的 Visual Studio,這里需要通過 Yeoman 來搭建基本的網站框架。

yeoman 需要通過 npm 來安裝,如果你已經安裝過 nodejs ,就已經安裝過它了,如果沒有,就先安裝 nodejs 吧。

由於 npm 服務器在國外,國內使用起來問題較多,淘寶提供了一個國內鏡像,保障了安裝網絡環境的穩定,和源地址10分鍾同步一次,沒有被收錄的包會自動切換到npm官方下載,並添加進鏡像庫。說明鏈接地址:http://ju.outofmemory.cn/entry/118659

臨時使用淘寶 npm 庫,可以使用如下命令

npm --registry https://registry.npm.taobao.org info underscore 

安裝了 npm 之后,就可以使用 install 命令來安裝 yeoman 了。

sudo npm install -g yo

安裝的輸出如下。 

/usr/local/bin/yo -> /usr/local/lib/node_modules/yo/lib/cli.js

> yo@1.4.6 postinstall /usr/local/lib/node_modules/yo
> yodoctor


Yeoman Doctor
Running sanity checks on your system

✔ Global configuration file is valid
✔ NODE_PATH matches the npm root
✔ No .bowerrc file in home directory
✔ No .yo-rc.json file in home directory

Everything looks all right!
yo@1.4.6 /usr/local/lib/node_modules/yo
├── array-uniq@1.0.2
├── figures@1.3.5
├── titleize@1.0.0
├── user-home@1.1.1
├── opn@1.0.2
├── humanize-string@1.0.1 (decamelize@1.0.0)
├── sort-on@1.2.0 (dot-prop@2.0.0)
├── yeoman-character@1.0.1 (supports-color@1.3.1)
├── async@0.9.0
├── string-length@1.0.0 (strip-ansi@2.0.1)
├── root-check@1.0.0 (sudo-block@1.2.0, downgrade-root@1.1.0)
├── cross-spawn@0.2.9 (lru-cache@2.6.2)
├── chalk@1.0.0 (escape-string-regexp@1.0.3, ansi-styles@2.0.1, supports-color@1.3.1, strip-ansi@2.0.1, has-ansi@1.0.3)
├── findup@0.1.5 (commander@2.1.0, colors@0.6.2)
├── yosay@1.0.3 (ansi-regex@1.1.1, ansi-styles@2.0.1, word-wrap@1.0.3, strip-ansi@2.0.1, pad-component@0.0.1, taketalk@1.0.0, minimist@1.1.1)
├── meow@3.1.0 (object-assign@2.0.0, camelcase-keys@1.0.0, minimist@1.1.1, indent-string@1.2.1)
├── package-json@1.1.0 (registry-url@3.0.3)
├── npm-keyword@1.1.1 (registry-url@3.0.3)
├── update-notifier@0.3.2 (is-npm@1.0.0, latest-version@1.0.0, semver-diff@2.0.0)
├── got@2.9.2 (lowercase-keys@1.0.0, is-stream@1.0.1, timed-out@2.0.0, object-assign@2.0.0, prepend-http@1.0.1, nested-error-stacks@1.0.0, statuses@1.2.1, infinity-agent@2.0.3, duplexify@3.3.0, read-all-stream@2.1.2)
├── fullname@1.1.0 (npmconf@2.1.1)
├── yeoman-environment@1.2.5 (escape-string-regexp@1.0.3, untildify@2.0.0, log-symbols@1.0.2, diff@1.4.0, text-table@0.2.0, debug@2.2.0, mem-fs@1.1.0, globby@1.2.0, grouped-queue@0.3.0)
├── configstore@0.3.2 (object-assign@2.0.0, xdg-basedir@1.0.1, osenv@0.1.0, graceful-fs@3.0.6, uuid@2.0.1, mkdirp@0.5.0, js-yaml@3.3.0)
├── insight@0.5.3 (object-assign@2.0.0, lodash.debounce@3.0.3, os-name@1.0.3, tough-cookie@0.12.1, request@2.55.0)
├── lodash@3.8.0
├── yeoman-doctor@1.3.2 (object-values@1.0.0, log-symbols@1.0.2, each-async@1.1.1, twig@0.7.2)
└── inquirer@0.8.3 (ansi-regex@1.1.1, cli-width@1.0.1, through@2.3.7, readline2@0.1.1, rx@2.5.2)

安裝 yeoman 之后,還需要安裝 aspnet 的模版庫。使用下面的命令

sudo npm install -g yo generator-aspnet

輸出如下內容。

/usr/local/bin/yo -> /usr/local/lib/node_modules/yo/lib/cli.js

> yo@1.4.6 postinstall /usr/local/lib/node_modules/yo
> yodoctor


Yeoman Doctor
Running sanity checks on your system

✔ Global configuration file is valid
✔ NODE_PATH matches the npm root
✔ No .bowerrc file in home directory
✔ No .yo-rc.json file in home directory

Everything looks all right!
yo@1.4.6 /usr/local/lib/node_modules/yo
├── titleize@1.0.0
├── array-uniq@1.0.2
├── figures@1.3.5
├── user-home@1.1.1
├── opn@1.0.2
├── humanize-string@1.0.1 (decamelize@1.0.0)
├── sort-on@1.2.0 (dot-prop@2.0.0)
├── yeoman-character@1.0.1 (supports-color@1.3.1)
├── async@0.9.0
├── string-length@1.0.0 (strip-ansi@2.0.1)
├── cross-spawn@0.2.9 (lru-cache@2.6.2)
├── chalk@1.0.0 (escape-string-regexp@1.0.3, ansi-styles@2.0.1, supports-color@1.3.1, strip-ansi@2.0.1, has-ansi@1.0.3)
├── root-check@1.0.0 (sudo-block@1.2.0, downgrade-root@1.1.0)
├── findup@0.1.5 (commander@2.1.0, colors@0.6.2)
├── yosay@1.0.3 (ansi-regex@1.1.1, ansi-styles@2.0.1, word-wrap@1.0.3, strip-ansi@2.0.1, pad-component@0.0.1, taketalk@1.0.0, minimist@1.1.1)
├── meow@3.1.0 (object-assign@2.0.0, camelcase-keys@1.0.0, minimist@1.1.1, indent-string@1.2.1)
├── npm-keyword@1.1.1 (registry-url@3.0.3)
├── package-json@1.1.0 (registry-url@3.0.3)
├── update-notifier@0.3.2 (is-npm@1.0.0, latest-version@1.0.0, semver-diff@2.0.0)
├── got@2.9.2 (lowercase-keys@1.0.0, is-stream@1.0.1, timed-out@2.0.0, object-assign@2.0.0, prepend-http@1.0.1, nested-error-stacks@1.0.0, statuses@1.2.1, infinity-agent@2.0.3, read-all-stream@2.1.2, duplexify@3.3.0)
├── fullname@1.1.0 (npmconf@2.1.1)
├── configstore@0.3.2 (object-assign@2.0.0, xdg-basedir@1.0.1, osenv@0.1.0, graceful-fs@3.0.6, uuid@2.0.1, mkdirp@0.5.0, js-yaml@3.3.0)
├── yeoman-environment@1.2.5 (untildify@2.0.0, log-symbols@1.0.2, escape-string-regexp@1.0.3, diff@1.4.0, text-table@0.2.0, debug@2.2.0, mem-fs@1.1.0, globby@1.2.0, grouped-queue@0.3.0)
├── insight@0.5.3 (object-assign@2.0.0, lodash.debounce@3.0.3, os-name@1.0.3, tough-cookie@0.12.1, request@2.55.0)
├── lodash@3.8.0
├── yeoman-doctor@1.3.2 (object-values@1.0.0, log-symbols@1.0.2, each-async@1.1.1, twig@0.7.2)
└── inquirer@0.8.3 (ansi-regex@1.1.1, cli-width@1.0.1, through@2.3.7, readline2@0.1.1, rx@2.5.2)

generator-aspnet@0.0.34 /usr/local/lib/node_modules/generator-aspnet
├── uuid@2.0.1
├── chalk@1.0.0 (escape-string-regexp@1.0.3, ansi-styles@2.0.1, supports-color@1.3.1, strip-ansi@2.0.1, has-ansi@1.0.3)
├── yosay@1.0.3 (string-length@1.0.0, word-wrap@1.0.3, strip-ansi@2.0.1, ansi-regex@1.1.1, ansi-styles@2.0.1, pad-component@0.0.1, taketalk@1.0.0, minimist@1.1.1)
├── chai@1.10.0 (assertion-error@1.0.0, deep-eql@0.1.3)
└── yeoman-generator@0.19.2 (read-chunk@1.0.1, detect-conflict@1.0.0, dargs@4.0.0, yeoman-welcome@1.0.1, xdg-basedir@1.0.1, user-home@1.1.1, diff@1.4.0, text-table@0.2.0, mime@1.3.4, async@0.9.0, istextorbinary@1.0.2, nopt@3.0.1, debug@2.2.0, run-async@0.1.0, cross-spawn@0.2.9, mem-fs-editor@1.2.3, mkdirp@0.5.0, shelljs@0.4.0, through2@0.6.5, cli-table@0.3.1, pretty-bytes@1.0.4, dateformat@1.0.11, underscore.string@3.0.3, glob@5.0.5, github-username@1.1.1, findup-sync@0.2.1, rimraf@2.3.3, class-extend@0.1.1, yeoman-assert@1.0.0, html-wiring@1.1.0, yeoman-environment@1.2.5, sinon@1.14.1, gruntfile-editor@1.0.0, lodash@3.8.0, download@4.1.2, inquirer@0.8.3)

安裝好生成器之后,我們終於可以創建一個網站項目了。直接在命令行輸入 yo 或者直接輸入 yo aspnet 就可以了。有向導的呀。

? 'Allo OpenXLive! What would you like to do? Aspnet

Make sure you are in the directory you want to scaffold into.
This generator can also be run with: yo aspnet


     _-----_
    |       |    .--------------------------.
    |--(o)--|    |      Welcome to the      |
   `---------´   |   marvellous ASP.NET 5   |
    ( _´U`_ )    |        generator!        |
    /___A___\    '--------------------------'
     |  ~  |     
   __'.___.'__   
 ´   `  |° ´ Y ` 

? What type of application do you want to create? Web Application
? What's the name of your ASP.NET application? WebApplication
   create WebApplication/.gitgnore
   create WebApplication/Startup.cs
   create WebApplication/bower.json
   create WebApplication/config.json
   create WebApplication/MessageService.cs
   create WebApplication/project.json
   create WebApplication/package.json
   create WebApplication/gruntfile.js
   create WebApplication/Models/AccountViewModels.cs
   create WebApplication/Models/IdentityModels.cs
   create WebApplication/Models/ManageViewModels.cs
   create WebApplication/Controllers/AccountController.cs
   create WebApplication/Controllers/HomeController.cs
   create WebApplication/Controllers/ManageController.cs
   create WebApplication/Compiler/Preprocess/RazorPreCompilation.cs
   create WebApplication/Migrations/000000000000000_CreateIdentitySchema.cs
   create WebApplication/Migrations/ApplicationDbContextModelSnapshot.cs
   create WebApplication/Properties/AppSettings.cs
   create WebApplication/Views/Account/ConfirmEmail.cshtml
   create WebApplication/Views/Account/ExternalLoginConfirmation.cshtml
   create WebApplication/Views/Account/ExternalLoginFailure.cshtml
   create WebApplication/Views/Account/ForgotPassword.cshtml
   create WebApplication/Views/Account/ForgotPasswordConfirmation.cshtml
   create WebApplication/Views/Account/Login.cshtml
   create WebApplication/Views/Account/Register.cshtml
   create WebApplication/Views/Account/ResetPassword.cshtml
   create WebApplication/Views/Account/ResetPasswordConfirmation.cshtml
   create WebApplication/Views/Account/SendCode.cshtml
   create WebApplication/Views/Account/VerifyCode.cshtml
   create WebApplication/Views/Home/Contact.cshtml
   create WebApplication/Views/Home/About.cshtml
   create WebApplication/Views/Home/Index.cshtml
   create WebApplication/Views/Manage/AddPhoneNumber.cshtml
   create WebApplication/Views/Manage/ChangePassword.cshtml
   create WebApplication/Views/Manage/Index.cshtml
   create WebApplication/Views/Manage/ManageLogins.cshtml
   create WebApplication/Views/Manage/RemoveLogin.cshtml
   create WebApplication/Views/Manage/SetPassword.cshtml
   create WebApplication/Views/Manage/VerifyPhoneNumber.cshtml
   create WebApplication/Views/Shared/Error.cshtml
   create WebApplication/Views/Shared/_Layout.cshtml
   create WebApplication/Views/Shared/_LoginPartial.cshtml
   create WebApplication/Views/Shared/_ValidationScriptsPartial.cshtml
   create WebApplication/Views/_GlobalImport.cshtml
   create WebApplication/Views/_ViewStart.cshtml
   create WebApplication/wwwroot/_references.js
   create WebApplication/wwwroot/css/site.css
   create WebApplication/wwwroot/favicon.ico
   create WebApplication/wwwroot/images/ASP-NET-Banners-01.png
   create WebApplication/wwwroot/images/ASP-NET-Banners-02.png
   create WebApplication/wwwroot/images/Banner-01-Azure.png
   create WebApplication/wwwroot/images/Banner-02-VS.png
   create WebApplication/wwwroot/lib/bootstrap-touch-carousel/css/bootstrap-touch-carousel.css
   create WebApplication/wwwroot/lib/bootstrap-touch-carousel/js/bootstrap-touch-carousel.js
   create WebApplication/wwwroot/lib/bootstrap/css/bootstrap-theme.css
   create WebApplication/wwwroot/lib/bootstrap/css/bootstrap-theme.min.css
   create WebApplication/wwwroot/lib/bootstrap/css/bootstrap.css
   create WebApplication/wwwroot/lib/bootstrap/css/bootstrap.min.css
   create WebApplication/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.eot
   create WebApplication/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.svg
   create WebApplication/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf
   create WebApplication/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.woff
   create WebApplication/wwwroot/lib/bootstrap/js/bootstrap.js
   create WebApplication/wwwroot/lib/bootstrap/js/bootstrap.min.js
   create WebApplication/wwwroot/lib/hammer.js/hammer.js
   create WebApplication/wwwroot/lib/hammer.js/hammer.min.js
   create WebApplication/wwwroot/lib/hammer.js/hammer.min.map
   create WebApplication/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
   create WebApplication/wwwroot/lib/jquery-validation/jquery.validate.js
   create WebApplication/wwwroot/lib/jquery/jquery-migrate.js
   create WebApplication/wwwroot/lib/jquery/jquery-migrate.min.js
   create WebApplication/wwwroot/lib/jquery/jquery.js
   create WebApplication/wwwroot/lib/jquery/jquery.min.js
   create WebApplication/wwwroot/lib/jquery/jquery.min.map


Your project is now created, you can use the following commands to get going
    dnu restore
    dnu build
    dnx . run for console projects
    dnx . kestrel or dnx . web for web projects



     _-----_
    |       |    .----------------------.
    |--(o)--|    |     Bye from us!     |
   `---------´   |      Chat soon.      |
    ( _´U`_ )    |      Yeoman team     |
    /___A___\    |   http://yeoman.io   |
     |  ~  |     '----------------------'
   __'.___.'__   
 ´   `  |° ´ Y ` 

太麻煩了?看看動畫吧。

資料來源:http://blogs.msdn.com/b/webdev/archive/2014/12/17/yeoman-generators-for-asp-net-vnext.aspx

在輸出的最后,已經說明我們需要的工作。執行 dnu restore, 但是,報錯了。

Restoring packages for /Users/Openxlive/Desktop/helloWeb/WebApplication/project.json
Writing lock file /Users/Openxlive/Desktop/helloWeb/WebApplication/project.lock.json
npm WARN package.json WebApplication@0.0.0 No description
npm WARN package.json WebApplication@0.0.0 No repository field.
npm WARN package.json WebApplication@0.0.0 No README data
grunt@0.4.5 node_modules/grunt
├── which@1.0.9
├── dateformat@1.0.2-1.2.3
├── eventemitter2@0.4.14
├── getobject@0.1.0
├── rimraf@2.2.8
├── colors@0.6.2
├── async@0.1.22
├── hooker@0.2.3
├── grunt-legacy-util@0.2.0
├── exit@0.1.2
├── nopt@1.0.10 (abbrev@1.0.5)
├── lodash@0.9.2
├── minimatch@0.2.14 (sigmund@1.0.0, lru-cache@2.6.2)
├── glob@3.1.21 (inherits@1.0.0, graceful-fs@1.2.3)
├── coffee-script@1.3.3
├── underscore.string@2.2.1
├── iconv-lite@0.2.11
├── findup-sync@0.1.3 (glob@3.2.11, lodash@2.4.2)
├── grunt-legacy-log@0.1.1 (underscore.string@2.3.3, lodash@2.4.2)
└── js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.16)

grunt-bower-task@0.4.0 node_modules/grunt-bower-task
├── colors@0.6.2
├── async@0.1.22
├── wrench@1.4.4
├── rimraf@2.0.3 (graceful-fs@1.1.14)
├── lodash@0.10.0
└── bower@1.3.12 (is-root@1.0.0, junk@1.0.1, stringify-object@1.0.1, which@1.0.9, abbrev@1.0.5, chmodr@0.1.0, osenv@0.1.0, archy@0.0.2, opn@1.0.2, rimraf@2.2.8, bower-logger@0.2.2, bower-endpoint-parser@0.2.2, graceful-fs@3.0.6, lockfile@1.0.0, lru-cache@2.5.2, nopt@3.0.1, retry@0.6.0, tmp@0.0.23, q@1.0.1, request-progress@0.3.0, shell-quote@1.4.3, chalk@0.5.0, semver@2.3.2, bower-json@0.4.0, fstream@1.0.6, p-throttler@0.1.0, mkdirp@0.5.0, promptly@0.2.0, bower-config@0.5.2, fstream-ignore@1.0.2, tar-fs@0.5.2, decompress-zip@0.0.8, request@2.42.0, glob@4.0.6, bower-registry-client@0.2.4, cardinal@0.4.0, mout@0.9.1, inquirer@0.7.1, insight@0.4.3, handlebars@2.0.0, update-notifier@0.2.0)
----------
System.ComponentModel.Win32Exception: ApplicationName='bower', CommandLine='install', CurrentDirectory='/Users/Openxlive/Desktop/helloWeb/WebApplication', Native error= Cannot find the specified file
  at System.Diagnostics.Process.Start_noshell (System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process process) [0x00000] in <filename unknown>:0 
  at System.Diagnostics.Process.Start_common (System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process process) [0x00000] in <filename unknown>:0 
  at System.Diagnostics.Process.Start (System.Diagnostics.ProcessStartInfo startInfo) [0x00000] in <filename unknown>:0 
  at Microsoft.Framework.PackageManager.ScriptExecutor.Execute (Microsoft.Framework.Runtime.Project project, System.String scriptName, System.Func`2 getVariable) [0x00000] in <filename unknown>:0 
  at Microsoft.Framework.PackageManager.RestoreCommand+<RestoreForProject>d__69.MoveNext () [0x00000] in <filename unknown>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter`1[System.Boolean].GetResult () [0x00000] in <filename unknown>:0 
  at Microsoft.Framework.PackageManager.RestoreCommand+<>c__DisplayClass68_0+<<ExecuteCommand>b__0>d.MoveNext () [0x00000] in <filename unknown>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] in <filename unknown>:0 
  at Microsoft.Framework.PackageManager.RestoreCommand+<ExecuteCommand>d__68.MoveNext () [0x00000] in <filename unknown>:0 
----------
Restore failed
ApplicationName='bower', CommandLine='install', CurrentDirectory='/Users/Openxlive/Desktop/helloWeb/WebApplication', Native error= Cannot find the specified file

看樣子是少了一個 bower 組件,重新安裝一下吧。

sudo npm install -g bower

輸出如下:

/usr/local/bin/bower -> /usr/local/lib/node_modules/bower/bin/bower
bower@1.4.1 /usr/local/lib/node_modules/bower
├── is-root@1.0.0
├── junk@1.0.1
├── stringify-object@1.0.1
├── user-home@1.1.1
├── abbrev@1.0.5
├── chmodr@0.1.0
├── rimraf@2.3.3
├── archy@1.0.0
├── opn@1.0.2
├── bower-logger@0.2.2
├── bower-endpoint-parser@0.2.2
├── graceful-fs@3.0.6
├── lockfile@1.0.0
├── nopt@3.0.1
├── lru-cache@2.6.2
├── retry@0.6.1
├── tmp@0.0.24
├── q@1.4.0
├── semver@2.3.2
├── p-throttler@0.1.1 (q@0.9.7)
├── fstream@1.0.6 (inherits@2.0.1)
├── promptly@0.2.0 (read@1.0.5)
├── which@1.1.1 (is-absolute@0.1.7)
├── tar-fs@1.5.0 (pump@1.0.0, tar-stream@1.1.4)
├── request-progress@0.3.1 (throttleit@0.0.2)
├── glob@4.5.3 (inherits@2.0.1, once@1.3.2, inflight@1.0.4, minimatch@2.0.7)
├── fstream-ignore@1.0.2 (inherits@2.0.1, minimatch@2.0.7)
├── chalk@1.0.0 (ansi-styles@2.0.1, escape-string-regexp@1.0.3, supports-color@1.3.1, strip-ansi@2.0.1, has-ansi@1.0.3)
├── github@0.2.4 (mime@1.3.4)
├── mkdirp@0.5.0 (minimist@0.0.8)
├── cardinal@0.4.4 (ansicolors@0.2.1, redeyed@0.4.4)
├── mout@0.11.0
├── bower-config@0.6.1 (osenv@0.0.3, graceful-fs@2.0.3, optimist@0.6.1, mout@0.9.1)
├── handlebars@2.0.0 (optimist@0.3.7, uglify-js@2.3.6)
├── decompress-zip@0.1.0 (mkpath@0.1.0, touch@0.0.3, readable-stream@1.1.13, binary@0.3.0)
├── shell-quote@1.4.3 (array-filter@0.0.1, array-reduce@0.0.0, array-map@0.0.0, jsonify@0.0.0)
├── bower-json@0.4.0 (graceful-fs@2.0.3, intersect@0.0.3, deep-extend@0.2.11)
├── inquirer@0.8.0 (figures@1.3.5, ansi-regex@1.1.1, mute-stream@0.0.4, through@2.3.7, readline2@0.1.1, chalk@0.5.1, lodash@2.4.2, rx@2.5.2, cli-color@0.3.3)
├── request@2.53.0 (caseless@0.9.0, json-stringify-safe@5.0.0, forever-agent@0.5.2, aws-sign2@0.5.0, stringstream@0.0.4, tunnel-agent@0.4.0, oauth-sign@0.6.0, isstream@0.1.2, node-uuid@1.4.3, qs@2.3.3, form-data@0.2.0, combined-stream@0.0.7, tough-cookie@1.1.0, bl@0.9.4, hawk@2.3.1, mime-types@2.0.11, http-signature@0.10.1)
├── bower-registry-client@0.3.0 (graceful-fs@2.0.3, request-replay@0.2.0, rimraf@2.2.8, lru-cache@2.3.1, async@0.2.10, mkdirp@0.3.5, request@2.51.0)
├── insight@0.5.3 (object-assign@2.0.0, async@0.9.0, lodash.debounce@3.0.3, tough-cookie@0.12.1, os-name@1.0.3)
├── update-notifier@0.3.2 (is-npm@1.0.0, string-length@1.0.0, semver-diff@2.0.0, latest-version@1.0.0)
└── configstore@0.3.2 (object-assign@2.0.0, xdg-basedir@1.0.1, osenv@0.1.0, uuid@2.0.1, js-yaml@3.3.0)

把 grunt 也安裝一下。

sudo npm install -g grunt-cli

輸出。

/usr/local/bin/grunt -> /usr/local/lib/node_modules/grunt-cli/bin/grunt
grunt-cli@0.1.13 /usr/local/lib/node_modules/grunt-cli
├── resolve@0.3.1
├── nopt@1.0.10 (abbrev@1.0.5)
└── findup-sync@0.1.3 (lodash@2.4.2, glob@3.2.11)

重新 restore ,終於成功了。

Restoring packages for /Users/Openxlive/Desktop/helloWeb/WebApplication/project.json
Writing lock file /Users/Openxlive/Desktop/helloWeb/WebApplication/project.lock.json
npm WARN package.json WebApplication@0.0.0 No description
npm WARN package.json WebApplication@0.0.0 No repository field.
npm WARN package.json WebApplication@0.0.0 No README data
Running "bower:install" (bower) task
>> Installed bower packages
>> Copied packages to /Users/Openxlive/Desktop/helloWeb/WebApplication/wwwroot/lib

Done, without errors.
Restore complete, 12380ms elapsed

運行網站。

dnx . kestrel

  Started

打開瀏覽器,訪問地址: http://localhost:5001 

居然又報了一個錯誤。

An unhandled exception occurred while processing the request.

IOException: kqueue() FileSystemWatcher has reached the maximum nunmber of files to watch.
System.IO.KqueueMonitor.Add (System.String path, Boolean postEvents, System.Collections.Generic.List`1& fds) [0x00000] in <filename unknown>, line 0

這是 Mono 的一個已知錯誤,需要一個設置。

export MONO_MANAGED_WATCHER=false

再次運行,終於可以看到網站了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM