콘텐츠로 이동

기존 프로젝트에 추가하기

모든 프로젝트가 pnpm create @aws/nx-workspace로 시작하는 것은 아닙니다. 이미 Nx 워크스페이스가 있거나 Nx를 추가할 수 있는 모노레포가 있다면, 프로젝트를 재생성하지 않고도 @aws/nx-plugin을 점진적으로 도입할 수 있습니다.

  • Git
  • Node >= 22 (NVM 같은 도구로 Node 버전 관리 권장)
    • node --version 실행하여 버전 확인
  • PNPM >= 11 (선호한다면 Yarn >= 4, Bun >= 1, NPM >= 10 사용 가능)
    • pnpm --version, yarn --version, bun --version 또는 npm --version 실행하여 버전 확인
  • UV >= 0.5.29
    1. uv python install 3.14.0 실행하여 Python 3.14 설치
    2. uv python list --only-installed 실행하여 확인
  • 애플리케이션을 배포할 대상 AWS 계정에 구성된 AWS 자격 증명

프로젝트가 아직 Nx를 사용하지 않는 경우, 먼저 nx init으로 추가하세요. 이것은 Nx 자체가 담당하는 단계이며, 플러그인은 작동하는 Nx 워크스페이스 위에 구축됩니다. 일반 패키지, npm/pnpm/yarn/bun 워크스페이스, Turborepo 또는 Lerna 모노레포에서 작동합니다:

Terminal window
pnpm dlx nx@23.0.2 init

프롬프트를 따라 워크스페이스에 Nx를 추가하세요. 자세한 내용은 Nx 문서를 참조하세요.

비-Node 프로젝트 (Python, Go, Java, Rust, …)

섹션 제목: “비-Node 프로젝트 (Python, Go, Java, Rust, …)”

Nx와 플러그인은 npm 패키지로 배포되므로, Node.js 도구가 없는 프로젝트는 nx init이 유용한 작업을 수행하기 전에 최소한의 루트 package.json이 필요합니다:

{
"name": "my-project",
"private": true,
"type": "module"
}

해당 파일을 생성한 다음 nx init을 실행하고 평소처럼 플러그인을 추가하세요. 기존 언어 도구는 그대로 유지됩니다 — 플러그인이 생성한 Nx 프로젝트(Python 프로젝트 포함)는 기존 코드와 함께 존재하며, 기존 빌드를 점진적으로 Nx에 연결할 수 있습니다.

기존 프로젝트를 Nx로 가져오려면 언어에 따라 몇 가지 옵션이 있습니다:

  • 공식 Nx 플러그인이 있는 언어Java (Gradle 또는 Maven).NET에는 프로젝트의 작업을 자동으로 추론하는 전용 플러그인이 있습니다. 관련 플러그인을 추가하세요. 예: nx add @nx/gradle, nx add @nx/maven 또는 nx add @nx/dotnet.
  • 커뮤니티 플러그인이 있는 언어 — 예를 들어 Go (@nx-go/nx-go) 또는 Rust (@monodon/rust). 다른 플러그인은 Nx Plugin Registry를 참조하세요.
  • 기타 언어 — 각 프로젝트에 project.json을 추가하고 기존 빌드 명령을 실행하도록 타겟을 정의하여 nx build <project> (및 nx run-many)가 이를 구동하도록 합니다. project.json 및 타겟 설정 방법은 워크스페이스 가이드를 참조하세요.

플러그인은 모노레포용으로 설계되었습니다 — 각 프로젝트를 packages/ 아래의 자체 디렉토리에 생성합니다. 단일 패키지 프로젝트(루트에 하나의 package.json이 있고 소스가 바로 아래에 있으며 워크스페이스가 없는 경우)에서 시작하는 경우, 플러그인을 도입하기 전에 기존 패키지를 packages/로 이동하여 프로젝트가 플러그인이 생성하는 프로젝트와 나란히 위치하도록 하세요:

  1. packages/<your-package>/ 디렉토리를 생성하고 소스, package.jsontsconfig.json을 그 안으로 이동하세요.

  2. 프로젝트 자체가 아닌 워크스페이스 매니페스트 역할을 하는 새로운 루트 package.json을 생성하세요:

    package.json
    {
    "name": "<your-workspace>",
    "private": true,
    "type": "module"
    }
  3. 패키지 매니저가 packages/ 아래의 프로젝트를 발견할 수 있도록 워크스페이스를 선언하세요. pnpm의 경우 pnpm-workspace.yaml을 추가하세요:

    pnpm-workspace.yaml
    packages:
    - packages/*

    npm/yarn/bun의 경우 대신 루트 package.jsonworkspaces 필드를 추가하세요:

    package.json
    {
    "workspaces": ["packages/*"]
    }
  4. nx init을 실행한 다음(아직 실행하지 않았다면), 플러그인을 추가하세요.

nx add를 사용하세요. 이는 Nx 설치와 호환되는 버전으로 플러그인을 설치한 다음 init 생성기를 실행하여 워크스페이스를 구성합니다:

Terminal window
pnpm nx add @aws/nx-plugin

완료되면 워크스페이스가 준비됩니다 — 필요한 생성기를 선택하고 프로젝트 생성을 시작하세요.

플러그인을 추가하면 워크스페이스가 플러그인의 생성기를 실행하는 데 필요한 결정론적 변경이 수행됩니다. 워크스페이스의 모듈 형식을 보존합니다: 루트 package.jsontype: "module"이 있는 워크스페이스는 ESM으로 유지되고, 그 외의 경우는 CommonJS로 유지되며, 생성된 코드도 이에 따릅니다. 기존 파일을 덮어쓰지 않으며, 기존 구성에 따라 이 단계 이후 일부 수동 변경이 필요할 수 있습니다.

다음 파일을 생성하거나 업데이트합니다:

  • aws-nx-plugin.config.mts 선택한 IaC 제공자(CDK 또는 Terraform)와 컨테이너 엔진을 기록합니다. 생성기는 여기에서 iac.provider를 읽습니다
  • nx.json compile 타겟에 동기화 생성기(@nx/js:typescript-sync@aws/nx-plugin:ts#sync)를 등록하여 TypeScript 프로젝트 참조가 동기화 상태를 유지하도록 합니다
  • tsconfig.json 워크스페이스의 프로젝트를 참조하는 루트 TypeScript 구성으로, Nx의 TypeScript 동기화가 최신 상태로 유지합니다
  • tsconfig.base.json 플러그인의 TypeScript 프로젝트가 확장하는 공유 컴파일러 옵션(포함하는 내용은 아래 참조)
  • pnpm-workspace.yaml (pnpm만 해당) 플러그인의 종속성이 필요로 하는 빌드 스크립트(@swc/core, esbuild, nx, sharp)를 허용 목록에 추가합니다
  • package.json 일반적인 작업을 위한 편의 스크립트와 nx, @nx/js, @nx/workspace, typescript 및 Biome 개발 종속성을 추가합니다
  • biome.json 기본 Biome 포매터 및 린터 구성
  • .mcp.json 비활성화되지 않는 한 지원되는 코딩 에이전트를 위한 MCP 서버를 구성합니다(.cursor/, .kiro/, .gemini/, .vscode/ 및 .codex/ 동등물도 포함)

MCP 서버 구성은 --mcp=false로 비활성화할 수 있습니다.

생성된 tsconfig.base.json이 포함하는 컴파일러 옵션을 보려면 여기를 클릭하세요.
매개변수타입기본값설명
iac cdk | terraformcdk선호하는 IaC 제공자입니다.
mcp booleantrue코딩 에이전트가 사용할 수 있도록 AWS MCP 서버용 Nx Plugin을 구성할지 여부입니다.
containers infer | docker | finchinfer빌드/푸시/로그인에 사용할 컨테이너 엔진입니다. 'infer'는 설치된 경우 docker를 선택하고, 그렇지 않으면 finch를 선택합니다(둘 다 설치되지 않은 경우 docker로 폴백).
preferInstallDependencies booleantrue제너레이터 실행 후 의존성 설치를 선호할지 여부입니다. 여러 제너레이터를 일괄 처리할 때 설치를 연기하려면 false로 설정하세요(후속 제너레이터가 Nx 프로젝트 그래프를 계산할 수 있도록 필요한 경우 설치는 여전히 실행됩니다). 마지막에 한 번 설치하세요.

TypeScript 프로젝트 참조를 동기화해야 합니다. init은 동기화 생성기를 등록합니다. 실행하세요:

Terminal window
pnpm nx sync

pnpm은 허용 목록에 없는 패키지의 설치 스크립트를 건너뜁니다. init은 플러그인의 도구가 필요로 하는 것(@swc/core, esbuild, nx, sharp)을 pnpm-workspace.yaml에서 허용 목록에 추가하지만, nx add @aws/nx-plugin 자체 중에 — init이 실행되기 전에 — 차단이 발생할 수 있습니다. pnpm approve-builds를 실행하고 나열된 패키지를 승인하거나(allowBuilds: 아래에 추가), 설치를 다시 실행하세요.

nx sync가 멈추거나 plugin worker ... exited before the connection was established

섹션 제목: “nx sync가 멈추거나 plugin worker ... exited before the connection was established”

두 개의 다른 nx 버전이 동일한 node_modules 트리에 있으면(npm ls nx를 실행하여 확인), 플러그인-워커 IPC가 교착 상태에 빠집니다. init 생성기는 루트 nx devDependency를 플러그인 자체의 @nx/* 패키지가 해결하는 버전으로 고정하지만, 다른 패치 버전의 다른 @nx/* 패키지를 나중에 설치하면 불일치가 다시 발생할 수 있습니다. 루트 package.json의 모든 nx@nx/* 항목을 단일 버전으로 정렬하고 재설치하세요.

워크스페이스에 TypeScript 7이 설치되어 있으며, Nx는 아직 이를 지원하지 않습니다 — Nx의 플러그인은 TypeScript의 인프로세스 컴파일러 API에 의존하는데, TypeScript 7은 더 이상 이를 제공하지 않습니다. 루트 package.json에서 typescript를 플러그인이 사용하는 버전으로 고정하고(init 생성기가 호환되는 버전을 설치함) 재설치하세요.

루트 package.json이 Nx 프로젝트로 등록되어 있고("nx" 키가 있으며, nx init이 단일 패키지 레포에 추가함) nx run-many --target buildbuild 스크립트를 가지고 있습니다. 그러면 Nx는 자신을 호출하는 루트에 build 타겟을 추론합니다. 소스를 packages/<your-package>/로 이동하여 루트가 프로젝트가 아닌 워크스페이스 매니페스트가 되도록 하세요 — 단일 패키지 프로젝트를 참조하세요. (Nx 자체의 독립형 프리셋은 루트 패키지에 "nx": { "includedScripts": [] }를 설정하여 이를 방지합니다. 더 빠른 대안으로 동일하게 수행할 수 있습니다.)

플러그인 추가 후 기존 프로젝트의 TypeScript 오류 (TS6059, TS7016, TS5011, NG4006)

섹션 제목: “플러그인 추가 후 기존 프로젝트의 TypeScript 오류 (TS6059, TS7016, TS5011, NG4006)”

플러그인 자체가 생성한 프로젝트는 프로젝트별 tsconfig.lib.json에 필요한 TypeScript 설정을 가지고 있으므로 tsconfig.base.json과 관계없이 빌드됩니다. 이러한 오류는 대신 init이 생성한 tsconfig.base.json(composite/emitDeclarationOnly/nodenext 포함)을 상속하지만 해당 설정과 호환되지 않는 기존 프로젝트에 나타납니다 — 예를 들어, Angular 컴파일러는 emitDeclarationOnly를 거부하거나(NG4006), rootDir 없이 outDir을 설정하는 프로젝트는 이제 하나가 필요합니다(TS5011). 해당 프로젝트에 대해 충돌하는 옵션을 다시 선언하는 프로젝트별 tsconfig 재정의를 추가하거나(예: "rootDir": "src"), 플러그인의 프로젝트와 프로젝트를 별도의 기본 구성으로 지정하세요.

init은 기존 tsconfig.base.json을 다시 작성하지 않습니다. 정확히 이를 상속하는 프로젝트를 조용히 깨뜨릴 수 없도록 하기 위함입니다 — 이러한 불일치를 해결하는 것은 코드베이스에 대해 귀하만이 내릴 수 있는 결정입니다.