I have an asp.net core project that builds properly with VS but doesn't build under msbuild.
It doesn't find all the common libs (system, etc)
I'm using teamcity and part of the build process is a nuget restore.
I tried to do the same steps as teamcity, but manually with msbuild, and it failed, not finding the libs.
I added a dotnet restore step and then it worked.
So, what is the difference between a nuget restore and a dotnet restore?
Nuget restore will ensure all of your nuget dependencies are downloaded and available to your project. Whereas dotnet restore is a complete restoration of all nuget dependencies as well as references and project specific tools. Meaning that if you run nuget restore, you are only restoring nuget packages.
According to docs.microsoft.com: Dotnet Restore
I had similar problems with a .net core 2 project that would build just fine on my workstation - both within Visual Studio 2017 and using msbuild only - but did not build in TeamCity. The errormessage was:
In my build configuration I already had a NuGet Install step before the build step:
It turned out I had to use:
Both
nuget restore
anddotnet restore
are roughly the same: They perform a nuget restore operation.The only difference:
dotnet restore
is a convenience wrapper to invokedotnet msbuild /t:Restore
which invokes an msbuild-integrated restore. This only works on msbuild distributions that include NuGet, such as VS 2017 (full VS, build tools) or Mono 5.2+ (=>msbuild /t:Restore
) and the .NET Core Sdk which provides this convenience command.At the moment, there are 2 ways of how NuGet packages can be used in projects (3 actually but let's ignore
project.json
on UWP for the moment):packages.config
: The "classic" way of referencing NuGet packages. This assumes NuGet is a separate tool and msbuild doesn't know anything about NuGet. A NuGet client such asnuget.exe
or VS-integrated tooling sees thepackages.config
file and downloads the referenced packages into a local folder on restore. A package install modifies the project to reference assets out of this local folder. So a restore for apackages.config
project only downloads the files.PackageReference
: The project contains MSBuild items that reference a NuGet package. Unlikepackages.config
, only the direct dependencies are listed and the project file does not directly reference any assets (dll files, content files) out of packages. On restore, NuGet figures out the dependency graph by evaluating the direct and transitive dependencies, makes sure all packages are downloaded into the user's global package cache (not solution-local so it is only downloaded once) and write an assets file into theobj
folder that contains a list of all packages and assets that the project uses, as well as additional msbuild targets if any package contains build logic that needs to be added to a project. So a nuget restore may download packages if they are not already in the global cache and create this assets file. In addition to package references, the project can also reference CLI tools, which are NuGet packages containing additional commands that will be available for thedotnet
in the project directory.The msbuild-integrated restore only works for
PackageReference
type projects (.NET Standard, .NET Core by default but are opt-in for any .NET project) and not forpackages.config
projects. If you use a new version ofnuget.exe
(e.g. 4.3.0), it is able to restore both project types.Your error about missing types is a bit more interesting: The "reference assemblies" (libraries that are passed as input to the compiler) are not installed on the system but come via NuGet packages. So as long as the NuGet packages are missing from the global package cache or the
obj/project.assets.json
file has not been generated by a restore operation, fundamental types likeSystem.Object
will not be available to the compiler.