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

  1. Verify the path exists: ls the exact absolute path shown in the error
  2. Fix the path in Pulumi.yaml or rebuild/install the plugin into that directory
  3. Run the plugin build step (make provider / make build_provider) before pulumi up
  4. 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

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


AI-assisted analysis of pulumi/pulumi@793f7b2e16 (2026-08-31). Data as JSON: /api/errors/f89b6530669d3862. Report an issue: GitHub.