

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

# 第 4 步：在设备上开发和测试组件
<a name="create-first-component"></a>

组件是在 AWS IoT Greengrass 核心设备上运行的软件模块。您可以利用这些组件创建和管理复杂的应用程序，并将其作为离散构建基块在不同的 Greengrass 核心设备之间重复使用。每个组件都包含*配方*和*构件*。
+ <a name="component-recipe-definition"></a>**配方**

  每个组件都包含一个用于定义其元数据的配方文件。此配方还指定了组件的配置参数、组件依赖关系、生命周期和平台兼容性。组件生命周期指定了安装、运行和关闭组件时要运行的命令。有关更多信息，请参阅 [AWS IoT Greengrass 组件配方参考](component-recipe-reference.md)。

  您可以用 [JSON](https://en.wikipedia.org/wiki/JSON) 或 [YAML](https://en.wikipedia.org/wiki/YAML) 格式定义配方。
+ <a name="component-artifacts-definition"></a>**构件**

  组件可以有任意数量的构件，即组件二进制文件。构件可以包括脚本、编译的代码、静态资源以及组件使用的任何其他文件。组件还可以使用组件依赖关系中的构件。

借助 AWS IoT Greengrass，您可以使用 Greengrass CLI 在 Greengrass 核心设备上本地开发和测试组件，而无需与云端交互。 AWS 完成本地组件后，您可以使用组件配方和工件在 AWS 云端的 AWS IoT Greengrass 服务中创建该组件，然后将其部署到所有 Greengrass 核心设备上。有关组件的更多信息，请参阅[开发 AWS IoT Greengrass 组件](develop-greengrass-components.md)。

本节中，您将学习如何在核心设备本地创建和运行 Hello World 基本组件。

**在设备上开发 Hello World 组件**

1. <a name="create-component-recipes-artifacts-folder-step"></a>为您的组件创建一个文件夹，其中包含用于存放配方和构件的子文件夹。在 Greengrass 核心设备上运行以下命令来创建这些文件夹并更改为组件文件夹。将*\$1/greengrassv2*或*%USERPROFILE%\$1greengrassv2*替换为用于本地开发的文件夹的路径。

------
#### [ Linux or Unix ]

   ```
   mkdir -p ~/greengrassv2/{recipes,artifacts}
   cd ~/greengrassv2
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   mkdir %USERPROFILE%\greengrassv2\\recipes, %USERPROFILE%\greengrassv2\\artifacts
   cd %USERPROFILE%\greengrassv2
   ```

------
#### [ PowerShell ]

   ```
   mkdir ~/greengrassv2/recipes, ~/greengrassv2/artifacts
   cd ~/greengrassv2
   ```

------

1. <a name="create-component-recipe-file-step"></a>使用文本编辑器创建配方文件，在该配方文件中定义组件的元数据、参数、依赖关系、生命周期和平台功能。在配方文件名中包含组件版本，以便您可以识别哪个配方对应哪个组件版本。您可以为配方选择 YAML 或 JSON 格式。

   <a name="nano-command-intro"></a>例如，在基于 Linux 的系统上，您可以运行以下命令来使用 GNU nano 创建该文件。

------
#### [ JSON ]

   ```
   nano recipes/com.example.HelloWorld-1.0.0.json
   ```

------
#### [ YAML ]

   ```
   nano recipes/com.example.HelloWorld-1.0.0.yaml
   ```

------
**注意**  
<a name="semver-para"></a>AWS IoT Greengrass 使用组件的语义版本。语义版本遵循 *major*.*minor*.*patch* 编号系统。例如，版本 `1.0.0` 表示组件的第一个主要版本。有关更多信息，请参阅[语义版本规范](https://semver.org/)。

1. 将以下配方粘贴到文件中。

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.HelloWorld",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "My first AWS IoT Greengrass component.",
     "ComponentPublisher": "Amazon",
     "ComponentConfiguration": {
       "DefaultConfiguration": {
         "Message": "world"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "linux"
         },
         "Lifecycle": {
           "run": "python3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
         }
       },
       {
         "Platform": {
           "os": "windows"
         },
         "Lifecycle": {
           "run": "py -3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
         }
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.HelloWorld
   ComponentVersion: '1.0.0'
   ComponentDescription: My first AWS IoT Greengrass component.
   ComponentPublisher: Amazon
   ComponentConfiguration:
     DefaultConfiguration:
       Message: world
   Manifests:
     - Platform:
         os: linux
       Lifecycle:
         run: |
           python3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
     - Platform:
         os: windows
       Lifecycle:
         run: |
           py -3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
   ```

------

   此配方的 `ComponentConfiguration` 部分定义了一个参数 `Message`，默认值为 `world`。`Manifests` 部分定义了一个*清单*，它是一组适用于平台的生命周期指令和构件。例如，您可以定义多个清单，为不同平台指定不同的安装说明。在清单中，`Lifecycle` 部分指示 Greengrass 核心设备以 `Message` 参数值为参数运行 Hello World 脚本。

1. 运行以下命令，为组件构件创建文件夹。

------
#### [ Linux or Unix ]

   ```
   mkdir -p artifacts/com.example.HelloWorld/1.0.0
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   mkdir artifacts\com.example.HelloWorld\1.0.0
   ```

------
#### [ PowerShell ]

   ```
   mkdir artifacts\com.example.HelloWorld\1.0.0
   ```

------
**重要**  <a name="local-artifact-folder-name-requirements"></a>
必须为构件文件夹路径使用以下格式。其中包括您在配方中指定的组件名称和版本。  

   ```
   artifacts/componentName/componentVersion/
   ```

1. 使用文本编辑器为 Hello World 组件创建 Python 脚本构件文件。

   <a name="nano-command-intro"></a>例如，在基于 Linux 的系统上，您可以运行以下命令来使用 GNU nano 创建该文件。

   ```
   nano artifacts/com.example.HelloWorld/1.0.0/hello_world.py
   ```

   将以下 Python 脚本复制并粘贴到文件中。

   ```
   import sys
   
   message = "Hello, %s!" % sys.argv[1]
   
   # Print the message to stdout, which Greengrass saves in a log file.
   print(message)
   ```

1. 使用本地 AWS IoT Greengrass CLI 来管理 Greengrass 核心设备上的组件。

   运行以下命令将组件部署到内 AWS IoT Greengrass 核。*C:\$1greengrass\$1v2*用你的 AWS IoT Greengrass V2 根文件夹替`/greengrass/v2`换*\$1/greengrassv2*或，*%USERPROFILE%\$1greengrassv2*用你的组件开发文件夹替换或。

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli deployment create \
     --recipeDir ~/greengrassv2/recipes \
     --artifactDir ~/greengrassv2/artifacts \
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create ^
     --recipeDir %USERPROFILE%\greengrassv2\recipes ^
     --artifactDir %USERPROFILE%\greengrassv2\artifacts ^
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create `
     --recipeDir ~/greengrassv2/recipes `
     --artifactDir ~/greengrassv2/artifacts `
     --merge "com.example.HelloWorld=1.0.0"
   ```

------

   此命令添加了使用 `recipes` 中配方和 `artifacts` 中 Python 脚本的组件。`--merge` 选项添加或更新了您指定的组件和版本。

1.  AWS IoT Greengrass Core 软件将组件进程中的 stdout 保存到文件夹中的日志文件中。`logs`运行以下命令，以验证 Hello World 组件是否运行并打印消息。

------
#### [ Linux or Unix ]

   ```
   sudo tail -f /greengrass/v2/logs/com.example.HelloWorld.log
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   type C:\greengrass\v2\logs\com.example.HelloWorld.log
   ```

   <a name="windows-cmd-type-observe-logs"></a>`type` 命令将文件内容写入终端。多次运行此命令，以观察文件中的更改。

------
#### [ PowerShell ]

   ```
   gc C:\greengrass\v2\logs\com.example.HelloWorld.log -Tail 10 -Wait
   ```

------

   您应该会看到类似于以下示例的消息。

   ```
   Hello, world!
   ```
**注意**  
如果文件不存在，可能是本地部署尚未完成。如果文件在 15 秒内不存在，则部署可能失败。例如，如果您的配方无效，则可能会发生这种情况。运行以下命令查看 AWS IoT Greengrass 核心日志文件。此文件包含来自 Greengrass 核心设备的部署服务的日志。  

   ```
   sudo tail -f /greengrass/v2/logs/greengrass.log
   ```

   ```
   type C:\greengrass\v2\logs\greengrass.log
   ```
<a name="windows-cmd-type-observe-logs"></a>`type` 命令将文件内容写入终端。多次运行此命令，以观察文件中的更改。

   ```
   gc C:\greengrass\v2\logs\greengrass.log -Tail 10 -Wait
   ```

1. 修改本地组件，以迭代和测试您的代码。`hello_world.py`在文本编辑器中打开，然后在第 4 行添加以下代码以编辑 AWS IoT Greengrass 核心记录的消息。

   ```
   message += " Greetings from your first Greengrass component."
   ```

   `hello_world.py` 脚本现在应包含以下内容。

   ```
   import sys
   
   message = "Hello, %s!" % sys.argv[1]
   message += " Greetings from your first Greengrass component."
   
   # Print the message to stdout, which Greengrass saves in a log file.
   print(message)
   ```

1. 运行以下命令，根据您的更改更新组件。

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli deployment create \
     --recipeDir ~/greengrassv2/recipes \
     --artifactDir ~/greengrassv2/artifacts \
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create ^
     --recipeDir %USERPROFILE%\greengrassv2\recipes ^
     --artifactDir %USERPROFILE%\greengrassv2\artifacts ^
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create `
     --recipeDir ~/greengrassv2/recipes `
     --artifactDir ~/greengrassv2/artifacts `
     --merge "com.example.HelloWorld=1.0.0"
   ```

------

   此命令使用最新的 Hello World 构件更新 `com.example.HelloWorld` 组件。

1. 要重新启动组件，请运行以下命令。重新启动组件时，核心设备将使用最新的更改。

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli component restart \
     --names "com.example.HelloWorld"
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli component restart ^
     --names "com.example.HelloWorld"
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli component restart `
     --names "com.example.HelloWorld"
   ```

------

1. 再次检查日志，验证 Hello World 组件是否打印了新消息。

------
#### [ Linux or Unix ]

   ```
   sudo tail -f /greengrass/v2/logs/com.example.HelloWorld.log
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   type C:\greengrass\v2\logs\com.example.HelloWorld.log
   ```

   <a name="windows-cmd-type-observe-logs"></a>`type` 命令将文件内容写入终端。多次运行此命令，以观察文件中的更改。

------
#### [ PowerShell ]

   ```
   gc C:\greengrass\v2\logs\com.example.HelloWorld.log -Tail 10 -Wait
   ```

------

   您应该会看到类似于以下示例的消息。

   ```
   Hello, world! Greetings from your first Greengrass component.
   ```

1. 您可以更新组件的配置参数来测试不同的配置。部署组件时，可以指定*配置更新*，该更新定义了如何在核心设备上修改组件的配置。您可以指定要重置为默认值的配置值以及要合并到核心设备上的新配置值。有关更多信息，请参阅 [更新组件配置](update-component-configurations.md)。

   执行以下操作：

   1. 使用文本编辑器创建名为 `hello-world-config-update.json` 的文件，其中包含配置更新。

      <a name="nano-command-intro"></a>例如，在基于 Linux 的系统上，您可以运行以下命令来使用 GNU nano 创建该文件。

      ```
      nano hello-world-config-update.json
      ```

   1. 将以下 JSON 对象复制并粘贴到文件中。此 JSON 对象定义了配置更新，该更新将值 `friend` 合并到 `Message` 参数以更新其值。此配置更新未指定任何要重置的值。您无需重置 `Message` 参数，因为合并更新会替换现有值。

      ```
      {
        "com.example.HelloWorld": {
          "MERGE": {
            "Message": "friend"
          }
        }
      }
      ```

   1. 运行以下命令，将配置更新部署到 Hello World 组件。

------
#### [ Linux or Unix ]

      ```
      sudo /greengrass/v2/bin/greengrass-cli deployment create \
        --merge "com.example.HelloWorld=1.0.0" \
        --update-config hello-world-config-update.json
      ```

------
#### [ Windows Command Prompt (CMD) ]

      ```
      C:\greengrass\v2\bin\greengrass-cli deployment create ^
        --merge "com.example.HelloWorld=1.0.0" ^
        --update-config hello-world-config-update.json
      ```

------
#### [ PowerShell ]

      ```
      C:\greengrass\v2\bin\greengrass-cli deployment create `
        --merge "com.example.HelloWorld=1.0.0" `
        --update-config hello-world-config-update.json
      ```

------

   1. 再次检查日志，验证 Hello World 组件是否输出了新消息。

------
#### [ Linux or Unix ]

      ```
      sudo tail -f /greengrass/v2/logs/com.example.HelloWorld.log
      ```

------
#### [ Windows Command Prompt (CMD) ]

      ```
      type C:\greengrass\v2\logs\com.example.HelloWorld.log
      ```

      <a name="windows-cmd-type-observe-logs"></a>`type` 命令将文件内容写入终端。多次运行此命令，以观察文件中的更改。

------
#### [ PowerShell ]

      ```
      gc C:\greengrass\v2\logs\com.example.HelloWorld.log -Tail 10 -Wait
      ```

------

      您应该会看到类似于以下示例的消息。

      ```
      Hello, friend! Greetings from your first Greengrass component.
      ```

1. 测试完组件后，将其从核心设备中移除。运行如下命令。

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli deployment create --remove="com.example.HelloWorld"
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create --remove="com.example.HelloWorld"
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create --remove="com.example.HelloWorld"
   ```

------
**重要**  
将组件上传到 AWS IoT Greengrass后，需要执行此步骤才能将其部署回核心设备。否则，部署会因版本兼容性错误而失败，因为本地部署指定了不同的组件版本。

   运行以下命令并确认 `com.example.HelloWorld` 组件未出现在设备上的组件列表中。

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli component list
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli component list
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli component list
   ```

------

你的 Hello World 组件已完成，你现在可以将其上传到 AWS IoT Greengrass 云服务了。然后，可以将组件部署到 Greengrass 核心设备。