pulumi/pulumi · error
no folder at path '%s'
Error message
no folder at path '%s'
What it means
After resolving the plugin path to an absolute location, resolvePluginPath stats the directory; if os.Stat reports the path does not exist, this error is returned. It means the configured plugin path points to a nonexistent folder on disk — the provider plugin binary/directory was not found where Pulumi.yaml says it should be.
Source
Thrown at pkg/resource/plugin/host.go:269
if err != nil {
return nil, err
}
return append(projectPlugins, pluginsFromPackages...), nil
}
func resolvePluginPath(root string, path string) (string, error) {
// The path is relative to the project root. Make it absolute here so we don't need to track that everywhere its used.
var err error
if !filepath.IsAbs(path) {
path, err = filepath.Abs(filepath.Join(root, path))
if err != nil {
return "", fmt.Errorf("getting absolute path for plugin path %s: %w", path, err)
}
}
stat, err := os.Stat(path)
if os.IsNotExist(err) {
return "", fmt.Errorf("no folder at path '%s'", path)
} else if err != nil {
return "", fmt.Errorf("checking provider folder: %w", err)
} else if !stat.IsDir() {
return "", fmt.Errorf("provider folder '%s' is not a directory", path)
}
return path, nil
}
func parsePluginOpts(
root string, providerOpts workspace.PluginOptions, k apitype.PluginKind,
) (workspace.ProjectPlugin, error) {
handleErr := func(msg string, a ...any) (workspace.ProjectPlugin, error) {
return workspace.ProjectPlugin{},
fmt.Errorf("parsing plugin options for '%s': %w", providerOpts.Name, fmt.Errorf(msg, a...))
}
if providerOpts.Name == "" {
return handleErr("name must not be empty")View on GitHub (pinned to 793f7b2e16)
Solutions
- Verify the path exists: ls the exact absolute path shown in the error
- Fix the path in Pulumi.yaml or rebuild/install the plugin into that directory
- Run the plugin build step (make provider / make build_provider) before pulumi up
- Commit or persist built plugin artifacts in CI, or install via pulumi plugin install instead of a local path
Example fix
// before (Pulumi.yaml)
plugins:
providers:
- name: myprov
path: ./build/myprov # folder not built yet
// after
plugins:
providers:
- name: myprov
path: ./bin/myprov # directory that exists after make provider Defensive patterns
Strategy: validation
Validate before calling
if st, err := os.Stat(pluginDir); os.IsNotExist(err) {
return fmt.Errorf("plugin directory %s does not exist; build it first", pluginDir)
} else if err == nil && !st.IsDir() {
return fmt.Errorf("%s is not a directory", pluginDir)
} Type guard
func pluginDirExists(p string) bool {
st, err := os.Stat(p)
return err == nil && st.IsDir()
} Prevention
- Build the provider before pulumi up (make provider)
- Check the exact path in Pulumi.yaml against the filesystem
- In CI, persist or rebuild plugin artifacts each run
- Prefer `pulumi plugin install` over local paths when possible
When it happens
Trigger: Setting plugins.<kind>.<name>.path in Pulumi.yaml (or passing --plugin-path) to a folder that does not exist, then starting a program that needs that provider.
Common situations: Typo in the path; building the plugin into a different output directory; CI checkout that doesn't include the locally built provider; deleting a vendor directory; moving the repo without updating the path.
Related errors
- no folder at path '%s'
- provider folder '%s' is not a directory
- create provider mapper: %w
- filesystem extra root %q is not a directory
- resolving %q: no allowed roots configured
AI-assisted analysis of pulumi/pulumi@793f7b2e16 (2026-08-31).
Data as JSON: /api/errors/f89b6530669d3862.
Report an issue: GitHub.