ASP.NET vNext(Project K/KVM/KPM/KRE/KLR) VS14 CTP3もろもろ
[2014年10月追記]CPT4
- CTP4についてメモ
- KPM
- パッケージ
- KREのパッケージ構造
C:\Program Files (x86)\Microsoft Web Tools\Kre>tree
Folder PATH listing
C:.
├───KRE-CLR-amd64.1.0.0-alpha4
│ └───bin
│ └───lib
│ ├───Microsoft.Framework.DesignTimeHost
│ ├───Microsoft.Framework.PackageManager
│ └───Microsoft.Framework.Project
├───KRE-CLR-x86.1.0.0-alpha4
│ └───bin
│ └───lib
│ ├───Microsoft.Framework.DesignTimeHost
│ ├───Microsoft.Framework.PackageManager
│ └───Microsoft.Framework.Project
├───KRE-CoreCLR-amd64.1.0.0-alpha4
│ └───bin
│ └───lib
│ ├───Microsoft.Framework.DesignTimeHost
│ ├───Microsoft.Framework.PackageManager
│ └───Microsoft.Framework.Project
├───KRE-CoreCLR-x86.1.0.0-alpha4
│ └───bin
│ └───lib
│ ├───Microsoft.Framework.DesignTimeHost
│ ├───Microsoft.Framework.PackageManager
│ └───Microsoft.Framework.Project
└───KRE-Mono.1.0.0-alpha4
└───bin
└───lib
├───Microsoft.Framework.DesignTimeHost
├───Microsoft.Framework.PackageManager
└───Microsoft.Framework.Project
CTP3の時に書いたメモ
この時はVisual Studio 14 CTP2でしたが、現在はCTP3が出ています。
ちらっとのぞいてみたところ、CTP2の時は各プロジェクトのPackagesフォルダにアセンブリが配置されていましたが、CTP3では、プロジェクト配下のPackagesフォルダが無くなり、%HOMEPATH%.KPM に集約されてすっきりしてました。
以下は気になったことの自分メモです
- project.jsonを編集して、たとえば、dependenciesに「"EntityFramework.InMemory": "7.0.0-alpha2-10018"」と書いたら、jsonファイル保存時にVSが依存性解決の確認を行う(KPMを動かす)
- 「"C:\Users\aoki\.kpm\packages\EntityFramework.InMemory\7.0.0-alpha3\lib\net45<K10とportable-net451+win81も>\EntityFramework.InMemory.dll"」がダウンロードされる。
- 7.0.0-alpha2-10018がダウンロードされるかと思ったら、7.0.0-alpha3だったので、少し想定とは違う..
- DLLのダウンロード前には、以下のリクエストを投げている。
- http://www.myget.org/F/aspnetrelease/api/v2/Packages()?$select=Version&$filter=(Id%20eq%20%27EntityFramework.InMemory%27)&$format=json
- MyGetで、該当ファイルを見つけられるので、
- http://www.myget.org/F/aspnetrelease/api/v2/package/EntityFramework.InMemory/7.0.0-alpha3-1049
- 等(取得できるURLのどれか)にアクセスして、「EntityFramework.InMemory.7.0.0-alpha4-10486.nupkg(実態はDLLが入ったZIP)」をダウンロード。
- http://www.nuget.org/api/v2/FindPackagesById%28%29?Id=%27EntityFramework.InMemory%27
- NuGetにもパッケージの確認をしているが、該当ファイルはなし
- http://www.myget.org/F/aspnetrelease/api/v2/Packages()?$select=Version&$filter=(Id%20eq%20%27EntityFramework.InMemory%27)&$format=json
- ちなみに、対象とするフレームワークの設定で、Core(K)を選んだときに保存される場所は、*.kprojではなく、*.kproj.userファイル(以下のイメージ)。実行時にどちらでも動くから「開発者の環境に依存するもの」という位置づけなんですかね。ちょっと違和感あり。
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <ActiveTargetFramework>K,Version=v1.0</ActiveTargetFramework> </PropertyGroup> </Project>
- *.kprojも変更あり。
- 以下のようにソースコードに含めるファイルの指定が無くなる。
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">12.0</VisualStudioVersion> <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> </PropertyGroup> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> </PropertyGroup> <Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.Props" Condition="'$(VSToolsPath)' != ''" /> <PropertyGroup Label="Globals"> <ProjectGuid>5613d12f-75e6-49d1-8a94-e1fed866c926</ProjectGuid> <OutputType>Web</OutputType> <RootNamespace>WebApplication2</RootNamespace> </PropertyGroup> <PropertyGroup Condition="$(OutputType) == 'Console'"> <DebuggerFlavor>ConsoleDebugger</DebuggerFlavor> </PropertyGroup> <PropertyGroup Condition="$(OutputType) == 'Web'"> <DebuggerFlavor>WebDebugger</DebuggerFlavor> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'" Label="Configuration"> </PropertyGroup> <PropertyGroup> <SchemaVersion>2.0</SchemaVersion> <DevelopmentServerPort>49214</DevelopmentServerPort> </PropertyGroup> <Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.targets" Condition="'$(VSToolsPath)' != ''" /> </Project>
- project.jsonの中身
- プロジェクトファイルの代わりにproject.jsonに含めるコードを書けるようになった。
- 含めるコードは「"code": "**\\*.cs;..\\Shared\\*.cs"」、除外コード「"exclude": "buggy/**/*.cs"」、リソースファイル「 "resources": "embed/**/*.*"」のイメージ
- configurationsで、コンパイラに与える指示でDebug、Release以外の指定が可能に。(デフォルトでこの2つは指定済み)
- ちなみにRoslynに与える指示は"compilationOptions"で指定
- ビルドイベントを「scripts」で設定できるように。ビルド前後、パッケージング前後、パッケージ展開前後のアクションを記載
- プロジェクトディレクトリ「%project:Directory% 」、プロジェクト名「%project:Name%」、プロジェクトバージョン「%project:Version%」の変数を指定可能
- アセンブリやプロジェクトの参照は、dependenciesに記載。
- フレームワークによって依存する内容やバージョンが違う場合は、"frameworks" で指定
- frameworksの指定は、net45かk10
- ただ「https://github.com/aspnet/MusicStore/blob/dev/src/MusicStore/project.json」を見ると、aspnet50とaspnetcore50になっていた。cloud最適化されたaspnetのフレームワークという位置づけ? 少し気になる。
- プロジェクトファイルの代わりにproject.jsonに含めるコードを書けるようになった。
{ "version": "0.1-alpha-*", "compilationOptions": { "warningsAsErrors": true }, "dependencies": { "Microsoft.Bcl.Immutable": "1.1.18-beta-*", "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", "Microsoft.AspNet.Logging": "0.1-alpha-*", "System.Data.Common": "0.1-alpha-*" }, "scripts": { "prebuild": "echo before building", "postbuild": "echo after building", "prepack": "echo before packing", "postpack": "echo after packing", "prerestore": "echo before restoring packages", "postrestore": "echo after restoring packages" }, "code": "**\\*.cs;..\\Shared\\*.cs", "configurations": { "Debug": { "compilationOptions": { "define": ["DEBUG", "TRACE"], "debugSymbols": "full" } }, "Release": { "compilationOptions": { "define": ["RELEASE", "TRACE"], "optimize": true, "debugSymbols": "pdbOnly" } } }, "frameworks": { "net45": { "dependencies": { "System.Runtime": "", "System.Collections": "" } }, "k10": { "dependencies": { "System.Collections": "4.0.0.0", "System.Collections.Concurrent": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Console": "4.0.0.0", "System.Diagnostics.Contracts": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", "System.Globalization": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Linq.Expressions": "4.0.0.0", "System.Linq.Queryable": "4.0.0.0", "System.Reflection": "4.0.10.0", "System.Reflection.Extensions": "4.0.0.0", "System.Resources.ResourceManager": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Threading": "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" } } } }
- MyGetのURLを設定する場所は、*.slnと同じ場所のNuget.config。
- Nuget.configなければ作る。デフォルトはaspnetrelease。aspnetmaster(Masterブランチ?)とaspnetvnext(開発中リポジトリ.DEVブランチ?)も指定できる。
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <!--<add key="AspNetVNext" value="https://www.myget.org/F/aspnetrelease/api/v2" />--> <!--<add key="AspNetVNext" value="https://www.myget.org/F/aspnetmaster/api/v2" />--> <add key="AspNetVNext" value="https://www.myget.org/F/aspnetvnext/api/v2" /> <add key="NuGet.org" value="https://nuget.org/api/v2/" /> </packageSources> </configuration>
- MyGetのフィードを、Visual Studio OnlineのGITコードから生成できる
- http://www.visualstudio.com/en-us/myget-and-vso-vs.aspx
- GitHubからデプロイもできるので、ビルドはMyGet側と思われます
- ソリューションフォルダと同じところに置く、Global.jsonは、 ソースやKPMのパッケージの場所を指定可能
- CTP3で、project.jsonを編集しようとしたら、DLLのインテリセンスのために、以下のようなリクエストを投げているよう(40件ずつとるので、3回)
- http://www.myget.org/F/aspnetrelease/api/v2/Packages%28%29?$orderby=DownloadCount%20desc&$select=Id&$skip=0&$top=40&$filter=%28Id%20ne%20null%29%20and%20IsAbsoluteLatestVersion&includePrerelease=true&$format=json
- http://www.myget.org//F/aspnetrelease/api/v2/Packages%28%29?$orderby=DownloadCount%20desc&$select=Id&$skip=40&$top=40&$filter=%28Id%20ne%20null%29%20and%20IsAbsoluteLatestVersion&includePrerelease=true&$format=json
- http://www.myget.org/F/aspnetrelease/api/v2/Packages%28%29?$orderby=DownloadCount%20desc&$select=Id&$skip=80&$top=20&$filter=%28Id%20ne%20null%29%20and%20IsAbsoluteLatestVersion&includePrerelease=true&$format=json
参考資料
- .NET vNextの資料が参考になります
- ASP.NET vNextの本家ブログは、InfoQのこの記事からたどって読むとよさそう。