Cannot find command 'dotnet ef'
I am using .NET Core 2.0 on Arch Linux / Visual Studio Code and am trying to get EF tools to work, but I keep getting the error:
cannot find command dotnet ef
I've just about looked everywhere and none of the suggestions worked.
The result of running 'dotnet ef':
[wasiim@wasiim-PC WebApiServerApp]$ dotnet ef --help
Cannot find command 'dotnet ef', please run the following command to install
dotnet tool install --global dotnet-ef
[wasiim@wasiim-PC WebApiServerApp]$ dotnet tool list -g
Package Id Version Commands
---------------------------------------------------
dotnet-dev-certs 2.2.0 dotnet-dev-certs
dotnet-ef 2.2.3 dotnet-ef
[wasiim@wasiim-PC WebApiServerApp]$
This is the 'dotnet --info' result, if it's of help:
[wasiim@wasiim-PC WebApiServerApp]$ dotnet --info
.NET Core SDK (reflecting any global.json):
Version: 2.2.105
Commit: 7cecb35b92
Runtime Environment:
OS Name: arch
OS Version:
OS Platform: Linux
RID: arch-x64
Base Path: /opt/dotnet/sdk/2.2.105/
Host (useful for support):
Version: 2.2.3
Commit: 6b8ad509b6
.NET Core SDKs installed:
2.2.105 [/opt/dotnet/sdk]
.NET Core runtimes installed:
Microsoft.NETCore.App 2.2.3 [/opt/dotnet/shared/Microsoft.NETCore.App]
To install additional .NET Core runtimes or SDKs:
https://aka.ms/dotnet-download
This is my .csproj file:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Lucene.Net.Analysis.Common" Version="4.8.0-beta00005" />
<PackageReference Include="Lucene.Net.QueryParser" Version="4.8.0-beta00005" />
<PackageReference Include="Microsoft.AspNetCore.App" Version="2.2.5" />
<PackageReference Include="Lucene.Net" Version="4.8.0-beta00005" />
<PackageGroup Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.4" />
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
</ItemGroup>
</Project>
In my case, the tools folder didn't exist inside %USERPROFILE%\.dotnet\
so I had to run the command dotnet tool install --global dotnet-ef
to install dotnet ef. Then I was able to run dotnet ef...
This was the result of the above install command:
Note to readers: If you haven't installed dotnet ef
, you need to install it first: dotnet tool install --global dotnet-ef
. The question-asker already did that. You need to do that first before the rest of this answer can help.
How to fix this
For Linux and macOS, add a line to your shell's configuration:
-
bash
/zsh
:export PATH="$PATH:$HOME/.dotnet/tools/"
-
csh
/tcsh
:set path = ($path $HOME/.dotnet/tools/)
When you start a new shell/terminal (or the next time you log in) dotnet ef
should work.
For Windows:
See this question on how to add to the PATH
environment variable.
You need to add %USERPROFILE%\.dotnet\tools
to the PATH
.
What's going on?
The .NET Core 3.0 (preview) version of this failure is much more illuminating:
$ dotnet ef
Could not execute because the specified command or file was not found.
Possible reasons for this include:
* You misspelled a built-in dotnet command.
* You intended to execute a .NET Core program, but dotnet-ef does not exist.
* You intended to run a global tool, but a dotnet-prefixed executable with this name could not be found on the PATH.
The second and the third one both refer to dotnet
trying to find a dotnet-ef
command but can't find it. As the third point says, dotnet-ef
is not in your path.
Here's what the docs say:
Global Tools can be installed in the default directory or in a specific location. The default directories are:
OS Path
Linux/macOS $HOME/.dotnet/tools
Windows %USERPROFILE%\.dotnet\tools
So, you should add $HOME/.dotnet/tools/
to your $PATH
.
But also note this part from docs:
These locations are added to the user's path when the SDK is first run, so Global Tools installed there can be called directly.
So, it sounds like something went wrong. If you installed using a manual tarball, the SDK screwed up and you should report this bug to Microsoft. If you use a distribution package, they screwed up and you should report this as a bug to them.