プロジェクトを自由に作れるようになりたくて。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch(9.0) 2018-06-27
- Mono 5.16.0
- MonoDevelop 7.6 build 711
- Eto.Forms 2.4.1 拡張機能, NuGetパッケージ
- .NET Core 2.2, MonoDevelop参照方法
前回まで
dotnet
コマンドは.NETプロジェクトを作成するコマンド。.NET Coreをインストールすることで使用できる。
- C#の実行環境について調べた(.NET Framework, .NET Core, .NET Standard, MONO)
- Raspbian stretch に .NET Core 2.2.101 をインストールした
- Raspbian stretch MonoDevelop で .NET Core 2.2.101 を参照する(.NET Standard 2.0)
- Raspbian stretch dotnet コマンドで .NET Core コンソールアプリ プロジェクトを作成&ビルドし実行できた
- Raspbian stretch dotnet コマンドで .NET Core コンソールアプリ+EFCore+SQLite3 プロジェクトを作成できた! やっとできた!
現状の問題
MonoDevelopでテスト用プロジェクトを実行できない。dotnet
ならできないかと期待。
やりたいこと
dotnet
- プロジェクト作成
- ソリューションファイル作成
- 任意プロジェクトを追加する
- プロジェクトファイル作成
- .NET Core, Standard, Framework の各種ライブラリ用プロジェクト
- Console, UnitTest, Library
- 別プロジェクトとの依存関係
- NuGetによるパッケージ追加
- カスタムテンプレート作成
- ソリューションファイル作成
- プロジェクト作成
特に以下のような単体テストとクラスライブラリのソリューション作成方法を知りたい。これは開発において基本となる構成なので。
- ソリューション
- プロジェクト(NUnit [.NET Core/Standard])
- プロジェクト(Library [.NET Core/Standard])
- プロジェクト(NUnit [.NET Core/Standard])
GUIに関してはdotnet
で開発できなさそう。MonoDevelopにてEto.Formsを使う。.NET Standardを用いているので移植できるよう.NET Standard用プロジェクトを作成できるか確認したい。
今回わかったこと
- テスト系プロジェクトは.NET Standardが使えない(.NET Core, Frameworkのみ可)
- Eto.Formsは.NET Standardを使うのでどうしたものか
今回わからなかったこと
dotnet new nunit
とdotnet new nunit-test
の違い--type
のproject
,item
,other
とは一体何なのか
調査
dotnet
システム
コマンド | 概要 | 値 |
---|---|---|
dotnet -h |
サブコマンド一覧 | |
dotnet サブコマンド -h |
各サブコマンドの引数詳細 | |
dotnet --version |
バージョン確認 | 2.2.101 |
dotnet --list-sdks |
2.2.101 [/home/pi/root/lib/.NETCore/2.2.101/sdk] |
|
dotnet --list-runtimes |
Microsoft.AspNetCore.All 2.2.0 [/home/pi/root/lib/.NETCore/2.2.101/shared/Microsoft.AspNetCore.All] Microsoft.AspNetCore.App 2.2.0 [/home/pi/root/lib/.NETCore/2.2.101/shared/Microsoft.AspNetCore.App] Microsoft.NETCore.App 2.2.0 [/home/pi/root/lib/.NETCore/2.2.101/shared/Microsoft.NETCore.App] |
プロジェクト関係
以下のコマンドが主に使いそう。
コマンド | 概要 |
---|---|
dotnet new |
新規作成する。ソリューション、プロジェクト等 |
dotnet sln |
ソリューションにプロジェクトを追加・削除する |
dotnet add reference |
プロジェクトに参照を追加する |
情報源
- https://docs.microsoft.com/ja-jp/dotnet/core/tools/?tabs=netcore2x
- ヘルプ
- ターミナルを起動して
dotnet -h
コマンドを実行する
- ターミナルを起動して
dotnet -h
$ dotnet -h .NET Command Line Tools (2.2.101) Usage: dotnet [runtime-options] [path-to-application] [arguments] Execute a .NET Core application. runtime-options: --additionalprobingpath <path> Path containing probing policy and assemblies to probe for. --additional-deps <path> Path to additional deps.json file. --fx-version <version> Version of the installed Shared Framework to use to run the application. --roll-forward-on-no-candidate-fx Roll forward on no candidate shared framework is enabled. path-to-application: The path to an application .dll file to execute. Usage: dotnet [sdk-options] [command] [command-options] [arguments] Execute a .NET Core SDK command. sdk-options: -d|--diagnostics Enable diagnostic output. -h|--help Show command line help. --info Display .NET Core information. --list-runtimes Display the installed runtimes. --list-sdks Display the installed SDKs. --version Display .NET Core SDK version in use. SDK commands: add Add a package or reference to a .NET project. build Build a .NET project. build-server Interact with servers started by a build. clean Clean build outputs of a .NET project. help Show command line help. list List project references of a .NET project. migrate Migrate a project.json project to an MSBuild project. msbuild Run Microsoft Build Engine (MSBuild) commands. new Create a new .NET project or file. nuget Provides additional NuGet commands. pack Create a NuGet package. publish Publish a .NET project for deployment. remove Remove a package or reference from a .NET project. restore Restore dependencies specified in a .NET project. run Build and run a .NET project output. sln Modify Visual Studio solution files. store Store the specified assemblies in the runtime package store. test Run unit tests using the test runner specified in a .NET project. tool Install or manage tools that extend the .NET experience. vstest Run Microsoft Test Engine (VSTest) commands. Additional commands from bundled tools: dev-certs Create and manage development certificates. ef Entity Framework Core command-line tools. sql-cache SQL Server cache command-line tools. user-secrets Manage development user secrets. watch Start a file watcher that runs a command when files change. Run 'dotnet [command] --help' for more information on a command.
dotnet new -h
ソリューションやプロジェクトファイル一式の作成。
$ dotnet new -h Usage: new [options] Options: -h, --help Displays help for this command. -l, --list Lists templates containing the specified name. If no name is specified, lists all templates. -n, --name The name for the output being created. If no name is specified, the name of the current directory is used. -o, --output Location to place the generated output. -i, --install Installs a source or a template pack. -u, --uninstall Uninstalls a source or a template pack. --nuget-source Specifies a NuGet source to use during install. --type Filters templates based on available types. Predefined values are "project", "item" or "other". --dry-run Displays a summary of what would happen if the given command line were run if it would result in a template creation. --force Forces content to be generated even if it would change existing files. -lang, --language Filters templates based on language and specifies the language of the template to create. Templates Short Name Language Tags ---------------------------------------------------------------------------------------------------------------------------- Console Application console [C#], F#, VB Common/Console Class library classlib [C#], F#, VB Common/Library Unit Test Project mstest [C#], F#, VB Test/MSTest NUnit 3 Test Project nunit [C#], F#, VB Test/NUnit NUnit 3 Test Item nunit-test [C#], F#, VB Test/NUnit xUnit Test Project xunit [C#], F#, VB Test/xUnit Razor Page page [C#] Web/ASP.NET MVC ViewImports viewimports [C#] Web/ASP.NET MVC ViewStart viewstart [C#] Web/ASP.NET ASP.NET Core Empty web [C#], F# Web/Empty ASP.NET Core Web App (Model-View-Controller) mvc [C#], F# Web/MVC ASP.NET Core Web App webapp [C#] Web/MVC/Razor Pages ASP.NET Core with Angular angular [C#] Web/MVC/SPA ASP.NET Core with React.js react [C#] Web/MVC/SPA ASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPA Razor Class Library razorclasslib [C#] Web/Razor/Library/Razor Class Library ASP.NET Core Web API webapi [C#], F# Web/WebAPI global.json file globaljson Config NuGet Config nugetconfig Config Web Config webconfig Config Solution File sln Solution Examples: dotnet new mvc --auth Individual dotnet new nunit -f net472 dotnet new --help
dotnet new nunit -h
テスト用プロジェクト作成。
$ dotnet new nunit -h Usage: new [options] Options: -h, --help Displays help for this command. -l, --list Lists templates containing the specified name. If no name is specified, lists all templates. -n, --name The name for the output being created. If no name is specified, the name of the current directory is used. -o, --output Location to place the generated output. -i, --install Installs a source or a template pack. -u, --uninstall Uninstalls a source or a template pack. --nuget-source Specifies a NuGet source to use during install. --type Filters templates based on available types. Predefined values are "project", "item" or "other". --dry-run Displays a summary of what would happen if the given command line were run if it would result in a template creation. --force Forces content to be generated even if it would change existing files. -lang, --language Filters templates based on language and specifies the language of the template to create. NUnit 3 Test Project (C#) Author: Aleksei Kharlov aka halex2005 (codeofclimber.ru) Description: A project that contains NUnit tests that can run on .NET Core on Windows, Linux and macOS Options: -f|--framework The target framework for the project. netcoreapp1.0 - Target netcoreapp1.0 netcoreapp1.1 - Target netcoreapp1.1 netcoreapp2.0 - Target netcoreapp2.0 netcoreapp2.1 - Target netcoreapp2.1 netcoreapp2.2 - Target netcoreapp2.2 netcoreapp3.0 - Target netcoreapp3.0 net35 - Target net35 net40 - Target net40 net45 - Target net45 net451 - Target net451 net452 - Target net452 net46 - Target net46 net461 - Target net461 net462 - Target net462 net47 - Target net47 net471 - Target net471 net472 - Target net472 net48 - Target net48 Default: netcoreapp2.2 -p|--enable-pack Whether or not to enable packaging (via ("dotnet pack") for the project. bool - Optional Default: false / (*) true --no-restore If specified, skips the automatic restore of the project on create. bool - Optional Default: false / (*) true * Indicates the value used if the switch is provided without a value.
netstandard1.6
などがない。
どうやらNUnit
, xUnit
, MSUnit
のテスト系プロジェクトはすべて.NET Standardでは実行できないらしい。テスト実行は特定のプラットフォームである必要があるとか。つまりStandardはクロスプラットフォーム用ライブラリだからテストできないということか。それひどくない?
解法としては以下か? テストプロジェクトと本番プロジェクトが別になってしまうため、変更するたびにコピペ作業が発生してしまう。
- .NET Core or Frameowrkでクラスライブラリプロジェクトを作成する
- .NET Core or Frameowrkで1のテストプロジェクトを作成する
- Eto.Forms(.NET Standard)プロジェクトに1のソースコードをコピペする
もしくはクラスライブラリプロジェクトを2種類作成する。
- .NET Core or Frameowrkでクラスライブラリプロジェクトを作成する
- .NET Core or Frameowrkで
1
のテストプロジェクトを作成する - .NET Standardでクラスライブラリプロジェクトを作成して
1
のコードをコピペする - Eto.Forms(.NET Standard)プロジェクトを作成し
3
を参照する
3
のプロジェクトが1
と重複するが仕方ない。
3
のソースコードは1
のシンボリックリンクにするのが良いか? しかし、GitHubなど別OSにアップロードすればリンク情報は消えてしまうだろう。冗長さは諦めるしかないか。
ソリューションを2つに分けるか一つにするか。テスト用とUI用の二つに分離したほうが見やすいが、管理のしやすさなら一つにまとめたほうがいい。一つにまとめた場合はスタートアッププロジェクトを切り替えることでテストとUI起動を変更できるはず。
dotnet new nunit-test -h
$ dotnet new nunit-test -h Usage: new [options] Options: -h, --help Displays help for this command. -l, --list Lists templates containing the specified name. If no name is specified, lists all templates. -n, --name The name for the output being created. If no name is specified, the name of the current directory is used. -o, --output Location to place the generated output. -i, --install Installs a source or a template pack. -u, --uninstall Uninstalls a source or a template pack. --nuget-source Specifies a NuGet source to use during install. --type Filters templates based on available types. Predefined values are "project", "item" or "other". --dry-run Displays a summary of what would happen if the given command line were run if it would result in a template creation. --force Forces content to be generated even if it would change existing files. -lang, --language Filters templates based on language and specifies the language of the template to create. NUnit 3 Test Item (C#) Author: Aleksei Kharlov aka halex2005 (codeofclimber.ru) Description: A item that contains NUnit tests (No Parameters)
--type
のproject
, item
, other
とは一体何なのか。dotnet new nunit
とdotnet new nunit-test
の違いは?
dotnet new classlib -h
クラスライブラリ用プロジェクト作成。
$ dotnet new classlib -h Usage: new [options] Options: -h, --help Displays help for this command. -l, --list Lists templates containing the specified name. If no name is specified, lists all templates. -n, --name The name for the output being created. If no name is specified, the name of the current directory is used. -o, --output Location to place the generated output. -i, --install Installs a source or a template pack. -u, --uninstall Uninstalls a source or a template pack. --nuget-source Specifies a NuGet source to use during install. --type Filters templates based on available types. Predefined values are "project", "item" or "other". --dry-run Displays a summary of what would happen if the given command line were run if it would result in a template creation. --force Forces content to be generated even if it would change existing files. -lang, --language Filters templates based on language and specifies the language of the template to create. Class library (C#) Author: Microsoft Description: A project for creating a class library that targets .NET Standard or .NET Core Options: -f|--framework The target framework for the project. netcoreapp2.2 - Target netcoreapp2.2 netstandard2.0 - Target netstandard2.0 Default: netstandard2.0 --langVersion Sets langVersion in the created project file text - Optional --no-restore If specified, skips the automatic restore of the project on create. bool - Optional Default: false / (*) true * Indicates the value used if the switch is provided without a value.
デフォルトがnetstandard2.0
だが、NUnitはnetstandard
が使えない。テストするときはどうするのが一般的なの?
dotnet sln -h
ソリューションにプロジェクトを追加する。dotnet new
でソリューションとプロジェクトを作成してから実行する。
$ dotnet sln -h Usage: dotnet sln [options] <SLN_FILE> [command] Arguments: <SLN_FILE> The solution file to operate on. If not specified, the command will search the current directory for one. Options: -h, --help Show command line help. Commands: add <PROJECT_PATH> Add one or more projects to a solution file. list List all projects in a solution file. remove <PROJECT_PATH> Remove one or more projects from a solution file.
dotnet add -h
プロジェクトの参照(依存関係)を設定する。dotnet new
でプロジェクトを作成してから実行する。
$ dotnet add -h Usage: dotnet add [options] <PROJECT> [command] Arguments: <PROJECT> The project file to operate on. If a file is not specified, the command will search the current directory for one. Options: -h, --help Show command line help. Commands: package <PACKAGE_NAME> Add a NuGet package reference to the project. reference <PROJECT_PATH> Add a project-to-project reference to the project.
dotnet add reference -h
$ dotnet add reference -h Usage: dotnet add <PROJECT> reference [options] <PROJECT_PATH> Arguments: <PROJECT> The project file to operate on. If a file is not specified, the command will search the current directory for one. <PROJECT_PATH> The paths to the projects to add as references. Options: -h, --help Show command line help. -f, --framework <FRAMEWORK> Add the reference only when targeting a specific framework.