这是indexloc提供的服务,不要输入任何密码
Skip to content

fix: warn when no packageManager #579

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jan 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 59 additions & 4 deletions cli/internal/backends/nodejs/nodejs.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package nodejs
import (
"fmt"
"io/ioutil"
"log"
"path/filepath"
"turbo/internal/api"
"turbo/internal/fs"
"turbo/internal/util"
Expand Down Expand Up @@ -42,14 +44,28 @@ var NodejsYarnBackend = api.LanguageBackend{
return false, nil
}

isBerry, err := util.IsBerry(cwd, version)
isBerry, err := util.IsBerry(cwd, version, true)
if err != nil {
return false, fmt.Errorf("could not determine yarn version (v1 or berry): %w", err)
}

if !isBerry {
return true, nil
}
} else {
log.Println("[WARNING] Did not find \"packageManager\" in your package.json. Please run \"npx @turbo/codemod add-package-manager\"")

specfileExists := fs.FileExists(filepath.Join(cwd, backend.Specfile))
lockfileExists := fs.FileExists(filepath.Join(cwd, backend.Lockfile))

isBerry, err := util.IsBerry(cwd, "", false)
if err != nil {
return false, fmt.Errorf("could not check if yarn is berry: %w", err)
}

if specfileExists && lockfileExists && !isBerry {
return true, nil
}
}

return false, nil
Expand Down Expand Up @@ -85,7 +101,7 @@ var NodejsBerryBackend = api.LanguageBackend{
return false, nil
}

isBerry, err := util.IsBerry(cwd, version)
isBerry, err := util.IsBerry(cwd, version, true)
if err != nil {
return false, fmt.Errorf("could not determine yarn version (v1 or berry): %w", err)
}
Expand All @@ -98,6 +114,27 @@ var NodejsBerryBackend = api.LanguageBackend{
return false, fmt.Errorf("only yarn v2/v3 with `nodeLinker: node-modules` is supported at this time")
}

return true, nil
}
} else {
log.Println("[WARNING] Did not find \"packageManager\" in your package.json. Please set the \"packageManager\" field to your package.json")

specfileExists := fs.FileExists(filepath.Join(cwd, backend.Specfile))
lockfileExists := fs.FileExists(filepath.Join(cwd, backend.Lockfile))

isBerry, err := util.IsBerry(cwd, "", false)
if err != nil {
return false, fmt.Errorf("could not check if yarn is berry: %w", err)
}

if specfileExists && lockfileExists && isBerry {
isNMLinker, err := util.IsNMLinker(cwd)
if err != nil {
return false, fmt.Errorf("could not check if yarn is using nm-linker: %w", err)
} else if !isNMLinker {
return false, fmt.Errorf("only yarn nm-linker is supported")
}

return true, nil
}
}
Expand Down Expand Up @@ -139,13 +176,22 @@ var NodejsPnpmBackend = api.LanguageBackend{
GetRunCommand: func() []string {
return []string{"pnpm", "run"}
},
Detect: func(_ string, pkg *fs.PackageJSON, backend *api.LanguageBackend) (bool, error) {
Detect: func(cwd string, pkg *fs.PackageJSON, backend *api.LanguageBackend) (bool, error) {
if pkg.PackageManager != "" {
packageManager, _ := util.GetPackageManagerAndVersion(pkg.PackageManager)

if packageManager == "pnpm" {
return true, nil
}
} else {
log.Println("[WARNING] Did not find \"packageManager\" in your package.json. Please run \"npx @turbo/codemod add-package-manager\"")

specfileExists := fs.FileExists(filepath.Join(cwd, backend.Specfile))
lockfileExists := fs.FileExists(filepath.Join(cwd, backend.Lockfile))

if specfileExists && lockfileExists {
return true, nil
}
}

return false, nil
Expand Down Expand Up @@ -173,13 +219,22 @@ var NodejsNpmBackend = api.LanguageBackend{
GetRunCommand: func() []string {
return []string{"npm", "run"}
},
Detect: func(_ string, pkg *fs.PackageJSON, backend *api.LanguageBackend) (bool, error) {
Detect: func(cwd string, pkg *fs.PackageJSON, backend *api.LanguageBackend) (bool, error) {
if pkg.PackageManager != "" {
packageManager, _ := util.GetPackageManagerAndVersion(pkg.PackageManager)

if packageManager == "npm" {
return true, nil
}
} else {
log.Println("[WARNING] Did not find \"packageManager\" in your package.json. Please run \"npx @turbo/codemod add-package-manager\"")

specfileExists := fs.FileExists(filepath.Join(cwd, backend.Specfile))
lockfileExists := fs.FileExists(filepath.Join(cwd, backend.Lockfile))

if specfileExists && lockfileExists {
return true, nil
}
}

return false, nil
Expand Down
24 changes: 22 additions & 2 deletions cli/internal/util/backends.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package util
import (
"fmt"
"io/ioutil"
"os/exec"
"path/filepath"
"regexp"
"strings"
Expand All @@ -19,7 +20,8 @@ func IsYarn(backendName string) bool {
return backendName == "nodejs-yarn" || backendName == "nodejs-berry"
}

func IsBerry(cwd string, version string) (bool, error) {
func IsBerry(cwd string, version string, pkgManager bool) (bool, error) {
if pkgManager {
v, err := semver.NewVersion(version)
if err != nil {
return false, fmt.Errorf("could not parse yarn version: %w", err)
Expand All @@ -30,6 +32,25 @@ func IsBerry(cwd string, version string) (bool, error) {
}

return c.Check(v), nil
} else {
cmd := exec.Command("yarn", "--version")
cmd.Dir = cwd
out, err := cmd.Output()
if err != nil {
return false, fmt.Errorf("could not detect yarn version: %w", err)
}

v, err := semver.NewVersion(strings.TrimSpace(string(out)))
if err != nil {
return false, fmt.Errorf("could not parse yarn version: %w", err)
}
c, err := semver.NewConstraint(">=2.0.0")
if err != nil {
return false, fmt.Errorf("could not create constraint: %w", err)
}

return c.Check(v), nil
}
}

func IsNMLinker(cwd string) (bool, error) {
Expand All @@ -53,4 +74,3 @@ func GetPackageManagerAndVersion(packageManager string) (string, string) {

return strings.Split(match, "@")[0], strings.Split(match, "@")[1]
}