

这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段，并于 2023 年 6 月 1 日终止支持。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS CDK 项目
<a name="projects"></a>

AWS 云开发工具包 (AWS CDK) 项目表示包含您的 CDK 代码的文件和文件夹。内容因您的编程语言而异。

您可以手动创建 AWS CDK 项目，也可以使用 AWS 命令行界面 (AWS CDK CLI) `cdk init` 命令进行创建。在本主题中，我们将介绍 AWS CDK CLI 创建的文件和文件夹的项目结构和命名约定。您可以自定义和组织 CDK 项目，以满足您的需求。

**注意**  
随着时间的推移，AWS CDK CLI 创建的项目结构可能会因版本而异。

## 通用文件和文件夹
<a name="projects-universal"></a><a name="projects-universal-git"></a>

 `.git`   
如果您已安装 `git`，则 AWS CDK CLI 会自动为项目初始化 Git 存储库。`.git` 目录包含了有关存储库的信息。<a name="projects-universal-gitignore"></a>

 `.gitignore`   
Git 使用的文本文件，用于指定要忽略的文件和文件夹。<a name="projects-universal-readme"></a>

 `README.md`   
文本文件，为您提供管理 AWS CDK 项目的基本指导和重要信息。根据需要修改此文件，以记录有关您 CDK 项目的重要信息。<a name="projects-universal-cdk"></a>

 `cdk.json`   
AWS CDK 的配置文件。此文件向 AWS CDK CLI 提供有关如何运行您的应用程序的说明。

## 特定于语言的文件和文件夹
<a name="projects-specific"></a>

以下文件和文件夹对于每种支持的编程语言都是唯一的。

**Example**  
以下是使用 `cdk init --language typescript` 命令在 `my-cdk-ts-project` 目录中创建的示例项目：  

```
my-cdk-ts-project
├── .git
├── .gitignore
├── .npmignore
├── README.md
├── bin
│   └── my-cdk-ts-project.ts
├── cdk.json
├── jest.config.js
├── lib
│   └── my-cdk-ts-project-stack.ts
├── node_modules
├── package-lock.json
├── package.json
├── test
│   └── my-cdk-ts-project.test.ts
└── tsconfig.json
```  
 `.npmignore`   
指定将软件包发布到 `npm` 注册表时要忽略哪些文件和文件夹的文件。此文件与 `.gitignore` 类似，但特定于 `npm` 软件包。  
 `bin/my-cdk-ts-project.ts`   
定义您 CDK 应用程序的*应用程序文件*。CDK 项目可以包含一个或多个应用程序文件。应用程序文件存储在 `bin` 文件夹中。  
以下是定义 CDK 应用程序的基本应用程序文件的示例：  

```
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { MyCdkTsProjectStack } from '../lib/my-cdk-ts-project-stack';

const app = new cdk.App();
new MyCdkTsProjectStack(app, 'MyCdkTsProjectStack');
```  
 `jest.config.js`   
Jest 的配置文件。*Jest* 是一个流行的 JavaScript 测试框架。  
 `lib/my-cdk-ts-project-stack.ts`   
定义您 CDK 堆栈的*堆栈文件*。在堆栈中，您可以使用构造来定义 AWS 资源和属性。  
以下是定义 CDK 堆栈的基本堆栈文件的示例：  

```
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class MyCdkTsProjectStack extends cdk.Stack {
 constructor(scope: Construct, id: string, props?: cdk.StackProps) {
  super(scope, id, props);

  // code that defines your resources and properties go here
 }
}
```  
 `node_modules`   
Node.js 项目中的常用文件夹，包含项目依赖项。  
 `package-lock.json`   
与 `package.json` 文件配合使用的元数据文件，用于管理依赖项的版本。  
 `package.json`   
Node.js 项目中常用的元数据文件。此文件包含有关您 CDK 项目的信息，例如项目名称、脚本定义、依赖项和其他导入项目级信息。  
 `test/my-cdk-ts-project.test.ts`   
创建了一个测试文件夹，用于组织您 CDK 项目的测试。还创建了一个示例测试文件。  
在运行测试之前，您可以在 TypeScript 中编写测试并使用 Jest 来编译 TypeScript 代码。  
 `tsconfig.json`   
TypeScript 项目中使用的配置文件，用于指定编译器选项和项目设置。
以下是使用 `cdk init --language javascript` 命令在 `my-cdk-js-project` 目录中创建的示例项目：  

```
my-cdk-js-project
├── .git
├── .gitignore
├── .npmignore
├── README.md
├── bin
│   └── my-cdk-js-project.js
├── cdk.json
├── jest.config.js
├── lib
│   └── my-cdk-js-project-stack.js
├── node_modules
├── package-lock.json
├── package.json
└── test
    └── my-cdk-js-project.test.js
```  
 `.npmignore`   
指定将软件包发布到 `npm` 注册表时要忽略哪些文件和文件夹的文件。此文件与 `.gitignore` 类似，但特定于 `npm` 软件包。  
 `bin/my-cdk-js-project.js`   
定义您 CDK 应用程序的*应用程序文件*。CDK 项目可以包含一个或多个应用程序文件。应用程序文件存储在 `bin` 文件夹中。  
以下是定义 CDK 应用程序的基本应用程序文件的示例：  

```
#!/usr/bin/env node

const cdk = require('aws-cdk-lib');
const { MyCdkJsProjectStack } = require('../lib/my-cdk-js-project-stack');

const app = new cdk.App();
new MyCdkJsProjectStack(app, 'MyCdkJsProjectStack');
```  
 `jest.config.js`   
Jest 的配置文件。*Jest* 是一个流行的 JavaScript 测试框架。  
 `lib/my-cdk-js-project-stack.js`   
定义您 CDK 堆栈的*堆栈文件*。在堆栈中，您可以使用构造来定义 AWS 资源和属性。  
以下是定义 CDK 堆栈的基本堆栈文件的示例：  

```
const { Stack, Duration } = require('aws-cdk-lib');

class MyCdkJsProjectStack extends Stack {
 constructor(scope, id, props) {
  super(scope, id, props);

  // code that defines your resources and properties go here
 }
}

module.exports = { MyCdkJsProjectStack }
```  
 `node_modules`   
Node.js 项目中的常用文件夹，包含项目依赖项。  
 `package-lock.json`   
与 `package.json` 文件配合使用的元数据文件，用于管理依赖项的版本。  
 `package.json`   
Node.js 项目中常用的元数据文件。此文件包含有关您 CDK 项目的信息，例如项目名称、脚本定义、依赖项和其他导入项目级信息。  
 `test/my-cdk-js-project.test.js`   
创建了一个测试文件夹，用于组织您 CDK 项目的测试。还创建了一个示例测试文件。  
在运行测试之前，您可以在 JavaScript 中编写测试并使用 Jest 来编译 JavaScript 代码。
以下是使用 `cdk init --language python` 命令在 `my-cdk-py-project` 目录中创建的示例项目：  

```
my-cdk-py-project
├── .git
├── .gitignore
├── .venv
├── README.md
├── app.py
├── cdk.json
├── my_cdk_py_project
│   ├── __init__.py
│   └── my_cdk_py_project_stack.py
├── requirements-dev.txt
├── requirements.txt
├── source.bat
└── tests
    ├── __init__.py
    └── unit
```  
 `.venv`   
CDK CLI 会自动为您的项目创建虚拟一个环境。`.venv` 目录指的就是这个虚拟环境。  
 `app.py`   
定义您 CDK 应用程序的*应用程序文件*。CDK 项目可以包含一个或多个应用程序文件。  
以下是定义 CDK 应用程序的基本应用程序文件的示例：  

```
#!/usr/bin/env python3
import os

import aws_cdk as cdk

from my_cdk_py_project.my_cdk_py_project_stack import MyCdkPyProjectStack

app = cdk.App()
MyCdkPyProjectStack(app, "MyCdkPyProjectStack")

app.synth()
```  
 `my_cdk_py_project`   
包含您*堆栈文件*的目录。CDK CLI 在此处创建以下内容：  
+ \$1\$1init\$1\$1.py – 一个空的 Python 包定义文件。
+  `my_cdk_py_project`：定义您 CDK 堆栈的文件。然后，您可以使用构造来定义堆栈中的 AWS 资源和属性。
以下是堆栈文件的示例：  

```
from aws_cdk import Stack

from constructs import Construct

class MyCdkPyProjectStack(Stack):
 def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
  super().__init__(scope, construct_id, **kwargs)

  # code that defines your resources and properties go here
```  
 `requirements-dev.txt`   
类似于 `requirements.txt` 的文件，但用于管理专用于开发目的而非生产目的的依赖项。  
 `requirements.txt`   
Python 项目中的常用文件，用于指定和管理项目依赖项。  
 `source.bat`   
适用于 Windows 的批处理文件，用于设置 Python 虚拟环境。  
 `tests`   
包含您 CDK 项目测试的目录。  
以下是单元测试的示例：  

```
import aws_cdk as core
import aws_cdk.assertions as assertions

from my_cdk_py_project.my_cdk_py_project_stack import MyCdkPyProjectStack

def test_sqs_queue_created():
 app = core.App()
 stack = MyCdkPyProjectStack(app, "my-cdk-py-project")
 template = assertions.Template.from_stack(stack)

 template.has_resource_properties("AWS::SQS::Queue", {
  "VisibilityTimeout": 300
 })
```
以下是使用 `cdk init --language java` 命令在 `my-cdk-java-project` 目录中创建的示例项目：  

```
my-cdk-java-project
├── .git
├── .gitignore
├── README.md
├── cdk.json
├── pom.xml
└── src
    ├── main
    └── test
```  
 `pom.xml`   
包含有关您 CDK 项目的配置信息和元数据的文件。此文件是 Maven 的一部分。  
 `src/main`   
包含您*应用程序*和*堆栈*文件的目录。  
以下是应用程序文件示例：  

```
package com.myorg;

import software.amazon.awscdk.App;
import software.amazon.awscdk.Environment;
import software.amazon.awscdk.StackProps;

import java.util.Arrays;

public class MyCdkJavaProjectApp {
 public static void main(final String[] args) {
  App app = new App();

  new MyCdkJavaProjectStack(app, "MyCdkJavaProjectStack", StackProps.builder()
   .build());

  app.synth();
 }
}
```
以下是堆栈文件示例：  

```
package com.myorg;

import software.constructs.Construct;
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.StackProps;

public class MyCdkJavaProjectStack extends Stack {
 public MyCdkJavaProjectStack(final Construct scope, final String id) {
  this(scope, id, null);
 }

 public MyCdkJavaProjectStack(final Construct scope, final String id, final StackProps props) {
  super(scope, id, props);

  // code that defines your resources and properties go here
 }
}
```  
 `src/test`   
包含您测试文件的目录。以下是示例：  

```
package com.myorg;

import software.amazon.awscdk.App;
import software.amazon.awscdk.assertions.Template;
import java.io.IOException;

import java.util.HashMap;

import org.junit.jupiter.api.Test;

public class MyCdkJavaProjectTest {

 @Test
 public void testStack() throws IOException {
  App app = new App();
  MyCdkJavaProjectStack stack = new MyCdkJavaProjectStack(app, "test");

  Template template = Template.fromStack(stack);

  template.hasResourceProperties("AWS::SQS::Queue", new HashMap<String, Number>() {{
   put("VisibilityTimeout", 300);
  }});
 }
}
```
以下是使用 `cdk init --language csharp` 命令在 `my-cdk-csharp-project` 目录中创建的示例项目：  

```
my-cdk-csharp-project
├── .git
├── .gitignore
├── README.md
├── cdk.json
└── src
    ├── MyCdkCsharpProject
    └── MyCdkCsharpProject.sln
```  
 `src/MyCdkCsharpProject`   
包含您*应用程序*和*堆栈*文件的目录。  
以下是应用程序文件示例：  

```
using Amazon.CDK;
using System;
using System.Collections.Generic;
using System.Linq;

namespace MyCdkCsharpProject
{
 sealed class Program
 {
  public static void Main(string[] args)
  {
   var app = new App();
   new MyCdkCsharpProjectStack(app, "MyCdkCsharpProjectStack", new StackProps{});
   app.Synth();
  }
 }
}
```
以下是堆栈文件示例：  

```
using Amazon.CDK;
using Constructs;

namespace MyCdkCsharpProject
{
 public class MyCdkCsharpProjectStack : Stack
 {
  internal MyCdkCsharpProjectStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
  {
   // code that defines your resources and properties go here
  }
 }
}
```
此目录还包含以下内容：  
  
+  `GlobalSuppressions.cs`：用于在整个项目中抑制特定编译器警告或错误的文件。
+  `.csproj` – 基于 XML 的文件，用于定义项目设置、依赖项并构建配置。---  
 `src/MyCdkCsharpProject.sln`   
 用于组织和管理相关项目的 Microsoft Visual Studio Solution File。
以下是使用 `cdk init --language go` 命令在 `my-cdk-go-project` 目录中创建的示例项目：  

```
my-cdk-go-project
├── .git
├── .gitignore
├── README.md
├── cdk.json
├── go.mod
├── my-cdk-go-project.go
└── my-cdk-go-project_test.go
```  
 `go.mod`   
包含模块信息的文件，用于管理 Go 项目的依赖项和版本控制。  
 `my-cdk-go-project.go`   
定义您 CDK 应用程序和堆栈的文件。  
以下是示例：  

```
package main
import (
 "github.com/aws/aws-cdk-go/awscdk/v2"
 "github.com/aws/constructs-go/constructs/v10"
 "github.com/aws/jsii-runtime-go"
)

type MyCdkGoProjectStackProps struct {
 awscdk.StackProps
}

func NewMyCdkGoProjectStack(scope constructs.Construct, id string, props *MyCdkGoProjectStackProps) awscdk.Stack {
 var sprops awscdk.StackProps
 if props != nil {
  sprops = props.StackProps
 }
 stack := awscdk.NewStack(scope, &id, &sprops)
 // The code that defines your resources and properties go here

  return stack
}

func main() {
 defer jsii.Close()
 app := awscdk.NewApp(nil)
 NewMyCdkGoProjectStack(app, "MyCdkGoProjectStack", &MyCdkGoProjectStackProps{
  awscdk.StackProps{
   Env: env(),
  },
 })
 app.Synth(nil)
}

func env() *awscdk.Environment {

 return nil
}
```  
 `my-cdk-go-project_test.go`   
定义示例测试的文件。  
以下是示例：  

```
package main

import (
 "testing"

 "github.com/aws/aws-cdk-go/awscdk/v2"
 "github.com/aws/aws-cdk-go/awscdk/v2/assertions"
 "github.com/aws/jsii-runtime-go"
)

func TestMyCdkGoProjectStack(t *testing.T) {

 // GIVEN
 app := awscdk.NewApp(nil)

 // WHEN
 stack := NewMyCdkGoProjectStack(app, "MyStack", nil)

 // THEN
 template := assertions.Template_FromStack(stack, nil)
 template.HasResourceProperties(jsii.String("AWS::SQS::Queue"), map[string]interface{}{
  "VisibilityTimeout": 300,
 })
}
```