这篇博客来使用.net core编写一个简单的项目,包含一个类库项目,一个类库项目的测试项目以及一个使用了类库项目的控制台项目,然后演示如何在多项目的模式下来调试代码。我的本机是mac,开发环境是VS Code。由于.net core是跨平台的,所以使用windows下的VS CODE应该也是可以的。
#准备
开发环境的准备工作请参考https://www.microsoft.com/net/core。
首先,新建一个名叫golden的文件夹作为该解决方案的根目录,然后再在下面新建两个文件夹,分别是src和test,然后在src下面新建两个文件夹分别为app和library,再在test文件夹下新建一个名为test-library的文件夹。
回到根目录(golden)下,新建一个globle.json文件作为我们的解决方案文件,类似.net framework项目的.sln文件,输入以下内容
{
"projects": [
"src",
"test"
]
}
最终,目录的层次结构是这样的
/golden
|__global.json
|__/src
|__/app
|__/library
|__/test
|__/test-library
#编写library
接下来编写一个名叫library的类库项目。将命令行工具定位到golden/src/library
,然后输入dotnet new -t lib
,这个命令创建了一个类库项目,包含project.json和Library.cs两个文件。
如果项目中需要用到别的组件(如Newtonsoft.Json),我们就在project.json中加入对Newtonsoft.Json的引用,修改后的project.json文件大概是这样的
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable"
},
"dependencies": {},
"frameworks": {
"netstandard1.6": {
"dependencies": {
"NETStandard.Library": "1.6.0",
"Newtonsoft.Json": "9.0.1-beta1"
}
}
}
}
这是执行dotnet restore
命令,将组件下载到本地,并生成project.lock.json文件。
接下来将Library.cs删掉,并新建一个Thing.cs,代码如下:
using System;
namespace Library
{
public class Thing
{
public int Get(int left, int right){
return left + right;
}
}
}
本例中我们并没有使用Newtonsoft.Json组件。。。
输入dotnet build
命令来编译我们的组件,完成后将会在golden/src/library/bin/Debug/netstandard1.6
目录下生成一个library.dll文件。类库项目编写完毕。
#编写测试项目
在test/test-library下执行dotnet new -t xunittest
命令。xunit.net是面向.net平台的一个比较主流的开源的单元测试框架。由于这个单元测试项目是针对library项目的单元测试项目,所以需要先引用library项目。又由于library项目在当前的解决方案中,所以我们不从NuGet获取而是从当前解决方案中获取,修改后的project.json文件如下:
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable"
},
"dependencies": {
"System.Runtime.Serialization.Primitives": "4.1.1",
"xunit": "2.1.0",
"dotnet-test-xunit": "1.0.0-rc2-192208-24",
"library": {
"target": "project"
}
},
"testRunner": "xunit",
"frameworks": {
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
}
},
"imports": [
"dotnet5.4",
"portable-net451+win8"
]
}
}
}
其中"library": {"target": "project"}
的意思是,library组件从当前的解决方案中获取,而不从NuGet中获取。
然后删掉默认生成的Test.cs文件,新建LibraryTests.cs文件,代码如下:
using Xunit;
using Library;
namespace Tests
{
public class LibraryTests
{
[Fact]
public void TestThing() {
Assert.Equal(42, new Thing().Get(19, 23));
}
}
}
接下来,运行dotnet restore
来下载必要的组件,运行dotnet build
编译代码,运行dotnet test
测试代码。如果顺利的话,测试的输出结果大致如下:
xUnit.net .NET CLI test runner (64-bit osx.10.11-x64)
Discovering: test-library
Discovered: test-library
Starting: test-library
Finished: test-library
=== TEST EXECUTION SUMMARY ===
test-library Total: 1, Errors: 0, Failed: 0, Skipped: 0, Time: 0.211s
SUMMARY: Total: 1 targets, Passed: 1, Failed: 0.
#编写控制台项目
在golden/src/app下运行dotnet new
,该命令创建了一个控制台项目,包含两个文件分别是Program.cs和project.json,我们需要引用当前解决方案下的library类库项目,所以需要在dependencies下加入对library项目的引用,修改后的project.json大致如下
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable"
},
"dependencies": {},
"frameworks": {
"netstandard1.6": {
"dependencies": {
"NETStandard.Library": "1.6.0",
"Newtonsoft.Json": "9.0.1-beta1"
}
}
}
}
然后将Program.cs的代码修改为
using System;
using Library;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Thing thing=new Thing();
int number = thing.Get(19,24);
Console.WriteLine($"The answer is {number}");
}
}
}
运行dotnet run
命令,如果顺利的话,会输出The answer is 43
,说明我们的项目完成了。
#在VS Code中调试代码
在单项目的情况下,调试代码是很顺其自然的事情,跟在VisualStudio你中是一样一样的。但是现在我们的解决方案中包含了多个项目,我们就会发现VS Code无法调试了,会提示你进行设置。VSCode默认会在.vscode文件夹中生成两个文件launch.json和tasks.json。
在tasks.json文件夹需要加入一个option属性"options": {"cwd": "${workspaceRoot}/src/app"}
,修改后的tasks.json文件类似这样
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "0.1.0",
"command": "dotnet",
"isShellCommand": true,
"args": [],
"tasks": [
{
"taskName": "build",
"args": [ ],
"isBuildCommand": true,
"showOutput": "silent",
"problemMatcher": "$msCompile"
}
],
"options": {
"cwd": "${workspaceRoot}/src/app"
}
}
在launch.json中需要修改program属性的地址,由原来的"program": "${workspaceRoot}/bin/Debug/<target-framework>/<project-name.dll>",
修改为"program": "${workspaceRoot}/src/app/bin/Debug/netcoreapp1.0/app.dll",
,这个是我们的控制台项目输出的dll文件。接下来就可以调试了!
这个逼装到最后,给一个原文的链接吧https://docs.microsoft.com/zh-cn/dotnet/articles/core/tutorials/using-on-macos