While working on my .Net Core Series I noticed that Visual Studio was adding a global.json file to the root of my project, and liked to put src and test in there. I thought I would investigate what it actually does.

I noticed that if all my project folders were next to each other it didn’t matter. So here is my experiment, and the results.

global.json

The default file I end up with in Visual Studio looks roughly like this:

{
  "projects": [ "src", "test" ],
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}

Setup

To start with, I created a folder to work in:

mkdir globaltest
cd globaltest

This will be the root folder of my testing today.

Side-by-Side

For starters, I will create two folders side by side, inside a folder called src.

mkdir src
cd src

First a library:

mkdir mylib
cd mylib
dotnet new -t lib
dotnet restore
dotnet build

Next, a sibling app project:

cd ../
mkdir app1
cd app1
dotnet new

And to make sure they are linked, I add a project reference to the app’s project.json file:

"mylib": {
    "target": "Project",
    "version": "*"
}

And test that it works

dotnet restore
dotnet build

And it does. Sibling project folders without a global.json file work successfully with project references.

Cousin projects

This time, I want to see what happens when there are two projects with an extra layer up between them. First back up to our root:

cd ../../

Now beside the original src folder we will create an other folder, and Inside it, a second app:

mkdir other
cd other
mkdir app2
cd app2
dotnet new

Again we add a project reference to the original lib project that is inside the src folder:

project.json

"mylib": {
    "target": "Project",
    "version": "*"
}

So now we have the following:

globaltest
|-- src
|    |-- mylib
|    |    |-- Library.cs
|    |    +-- project.json
|    +-- app1
|         |-- Program.cs
|         +-- project.json
+-- other
     +-- app2
          |-- Program.cs
          +-- project.json

For the moment of truth, we test if we can do a restore from app2:

dotnet restore

Fail.

error: Unable to resolve 'mylib' for '.NETCoreApp,Version=v1.0'.

Looks like we might need the global.json file for just this situation:

cd ../../
touch global.json

lets put the following in there:

{
  "projects": [ "src", "other" ],
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}

And one more time now:

cd other/app2
dotnet restore
dotnet build

Success!

Conclusion

So why do when do we need a global.json? When our projects are spread out across different levels at different nesting. When can we do without? When the projects that need to reference each other are in folders right next to each other.

There are more complex scenarios I could have tried, but I’m happy to stop here. But please, keep testing to look for other cases that interest you, by all means.