snow app bundle

准备一个本地文件夹,其中包含已配置的应用程序工件。

语法

snow app bundle
  --package-entity-id <package_entity_id>
  --app-entity-id <app_entity_id>
  --project <project_definition>
  --env <env_overrides>
  --format <format>
  --verbose
  --debug
  --silent
  --enhanced-exit-codes
  --decimal-precision <decimal_precision>

实参

无

选项

--package-entity-id TEXT

当 definition_version 为 2 或更高时,要操作的包实体的 ID。

--app-entity-id TEXT

当 definition_version 为 2 或更高时,要操作的应用程序实体的 ID。

-p, --project TEXT

Snowflake 项目的存储路径。默认为当前工作目录。

--env TEXT

格式为 key=value 的字符串。替换用于模板的 env 部分的变量。默认值:[]。

--format [TABLE|JSON| JSON_EXT|CSV]

指定输出格式。默认:TABLE。

--verbose, -v

显示日志级别 info 及更高级别的日志条目。默认值:False。

--debug

显示日志级别 debug 及更高级别的日志条目;调试日志包含其他信息。默认值:False。

--silent

关闭到控制台的中间输出。默认值:False。

--enhanced-exit-codes

根据错误类型区分退出错误代码。默认值:False。

--decimal-precision INTEGER

Number of decimal places to display for decimal values. Uses Python's default precision if not specified. [env var: SNOWFLAKE_DECIMAL_PRECISION].

--help

显示此命令的帮助文本。

使用说明

snow app bundle 命令会创建一个临时本地目录,其中包含所有 Snowflake Native App 工件。它还可以使用 Snowpark Python 代码自动生成 SQL 脚本。此命令可由 snow app deploy、Snow 应用程序运行 和 snow app version create 命令自动调用。但是,如果您想查看安装脚本、工件和生成的 SQL,在将它们上传到暂存区之前,您可以手动运行此命令。有关生成 SQL 代码的更多信息,请参阅 为本地文件夹准备已配置的 Snowflake Native App 工件。

  • 该命令使用 项目定义文件 确定要在项目目录中创建的临时文件夹的名称。

    • 默认情况下,它将是 <project_directory>/output/deploy。此目录也称为部署根目录,文件在后续命令中上传到暂存区后,此目录将反映暂存区的结构。

    • 如果您希望使用 Snowflake CLI 创建具有自定义名称,而非使用 output/deploy 的文件夹,您可以通过提供位于 项目定义文件 中的 应用程序包 实体的 deploy_root 字段执行上述操作。

      备注

      您必须为部署根目录提供相对路径;绝对路径会被拒绝。部署根路径是在项目目录内部创建的。

    • 部署根目录是一个临时目录,因为每次 run snow app bundle 或其他命令调用 bundle 功能时,它都会被删除并重新创建。

  • 由于 snow app bundle 会作为 snow app deploy、Snow 应用程序运行 和 snow app version create 命令的一部分被自动调用,因此只能在部署根目录之外更改源文件。如果修改了部署根目录下的文件,下次调用这些命令时,这些文件将被源文件的最新状态覆盖。

  • 如果使用版本控制系统(例如 git),您可以选择不跟踪部署根目录,因为它可能会频繁更改。

  • snow app bundle 不会为您构建或编译工件,例如从 Java 文件创建 jar 文件。它仅会复制项目定义文件中指定的工件,并将它们添加到部署根目录以模拟暂存区的目录结构。

  • snow app bundle 不需要访问您的 Snowflake 账户;它只会影响您的本地文件系统。

  • 对于 项目定义文件 中 应用程序包 实体的任何 artifacts,该命令具有以下复制和符号链接行为:

    • 源路径中的所有目录名称也会在部署根目录中创建。

    • 源路径中的所有文件都会在部署根目录中进行符号链接。

    • 如果您从这些文件中调用 SQL 生成,部署根目录中的某些符号链接文件会变成硬链接。有关更多信息,请参阅 为本地文件夹准备已配置的 Snowflake Native App 工件。

    请考虑以下项目定义文件中的 artifacts 列表示例:

    entities:
      pkg:
        type: application package
        ...
        artifacts:
          - src: dir1/dir2/*
            dest: dest_dir1/dest_dir2/
          - src: dir8/dir9/file.txt
            dest: dest_dir8/dest_file.txt
      ...
    

    在项目根目录中,dir1/dir2 可能还有其他子目录,例如 dir3 和 dir4,以及一些文件,例如 file3.txt 和 file4.txt。

    运行 snow app bundle 命令后,您的部署根目录应如下所示:

    -- deploy_root
          -- dest_dir1
                -- dest_dir2
                      -- dir3
                          -- ... <entire directory tree of dir3>
                      -- dir4
                          -- ... <entire directory tree of dir4>
                      -- file3.txt
                      -- file4.txt
          -- dest_dir8
                -- dest_file.txt
    

Snowpark 注释处理

从 Snowflake CLI 版本 2.5.0 和 Snowpark Python API 版本 1.15.0 开始,您可以通过 snow app bundle 命令利用 Snowpark 注释处理功能。此功能允许您使用 Snowpark Python 装饰器注释 Python 代码文件,例如 @udf、@sproc、@udaf 和 @udtf,以便 Snowflake CLI 自动包含相应的 CREATE FUNCTION 或 CREATE PROCEDURE SQL 语句。为了更好地理解这些装饰器,请参考相应的 Python 装饰器文档。

Snowpark 注释处理涉及以下内容:

  • 它会读取您在项目定义文件中使用 processor 字段标记的所有 Python 文件。

  • 它会使用处理器的 properties 子字段中提供的环境信息,创建一个单独的临时 Python 沙盒环境。

  • 它会在沙盒环境中执行这些 Python 文件。

  • 它会从这些文件收集所有装饰的函数。

  • 借助收集到的信息,Snowflake CLI 会生成必要的 SQL 语句,并将它们添加到安装脚本中,该脚本的位置在 manifest.yaml 文件中指定。

在为 Snowflake Native App 应用程序编写 Snowpark 扩展函数时,您不再需要重复样板 SQL 代码。

有关在项目定义文件中启用此功能的更多信息,请参阅 使用 Snowpark Python 装饰器。

有关所有受支持工件处理器的更多信息,请参阅 有关工件处理器的更多信息。

示例

此示例假定您已对代码文件进行了必要的更改,并将其添加到 snowflake.yml 或 snowflake.local.yml 文件中,并且还构建或编译了任何相关的工件。

cd my_app_project
snow app bundle

该命令显示了有关命令运行时发生的各种步骤的信息,并在项目定义文件中指定的位置创建新目录(默认值:my_app_project/output/deploy)。

要查看简单用例的实际操作,您可以使用以下命令利用现成的模板:

snow init my_app_bundle_project --template app_basic
cd "my_app_bundle_project"
snow app bundle
ls my_app_bundle_project/output/deploy