繁体   English   中英

如何使用 Nx 运行单个 typescript 文件

[英]How to run a single typescript file with Nx

我有一个使用预处理摘要统计文件的 Nx Node 项目。 这些统计文件需要大量处理,很少需要生成。 但是,一旦生成它们,主节点应用程序就会快速运行。

我想要一个可以手动运行的预处理步骤来生成这些统计资产。 我想使用 Nx 的 typescript,更漂亮和 linting 支持来编写代码来生成这些统计文件。 但是为每个处理步骤创建一个完整的 Node Nx 库似乎是很多不必要的基础设施。

有一个运行自定义命令的选项: https://nx.dev/latest/node/executors/run-commands-builder 我想使用 Typescript 文件执行此操作,但文档仅显示 shell 命令或组合预先存在的 Nx 命令。 AFAICT 我不能只将其指向 typescript 文件。

问题是:

  1. 我可以运行自定义命令来触发单个 typescript 文件吗?
  2. 为每个生成这些统计信息的文件创建一个完整的 Node 库是否更习惯?

谢谢

您不必为每个创建单独的库。 如果它们都属于“生成我的预处理统计信息”的类别,那么它们可以(也许应该)go 一起。

至于触发单个 TypeScript 文件,TypeScript 文件并不意味着被触发。 相反,我们将它们编译成 JS 并使用 Node.js 运行 JS 文件。 通常,这会转换为以下命令:

  1. 运行tsc编译您的 TypeScript 文件。
  2. 运行node <your-main-file>.js来执行你的 JS 文件。

汇编

命令 描述
tsc index.ts 在当前目录中编译一个名为index.ts的文件。
tsc *.ts 编译当前目录下的所有TypeScript文件。
tsc --project tsconfig.stats-type1.json
tsc --project tsconfig.stats-type2.json
...
根据当前目录下的指定配置文件进行编译。

最后一个示例显示了如何在库中拥有多个tsconfig.json文件,每个统计类型一个,以便根据需要创建不同的编译变体。

有关详细信息,请参阅tsc CLI 选项

执行

之后,根据您告诉tsc到 output 文件的位置,将创建的文件传递给node

如果您想在一个命令中运行多个文件,有几种方法可以做到这一点。 一种是创建一个主文件,该文件从所有其他文件中导入和调用函数。

祝你好运。

我遇到了与您类似的用例:我有一个 NX 应用程序,它需要某种脚本才能运行(并非总是如此,所以我不能将它们放在应用程序的某个实用程序中)。 这些脚本不需要转译为 js,但我想使用我的 nx monorepo 中的所有 utils 和 libs。

我的解决方案是在我的应用程序中创建一个脚本文件夹并将其从构建过程中排除,然后在 workspace.json(或 project.json)上我添加了这个目标:

{
  "run-script": {
    "executor": "@nrwl/workspace:run-commands",
    "configurations": {
      "my-script": {
        "commands": [
          "ts-node apps/path/to/my/script.ts"
        ]
      }
    }
  }
}

我可以使用以下命令运行它:

nx run my-project:run-script:my-script

如果您有专门的 tsconfig 文件和脚本使用的依赖库,则执行脚本的编译版本可以避免很多麻烦。 执行以下操作:

nx g @nrwl/workspace:run-commands run-script --project my-project --command 'node dist/apps/my-project/main.js'

创建一个使用脚本的 javascript 编译绕过所有 typescript 配置的命令。 它在 apps/my-project/project.json 中产生以下内容

    "run-script": {
      "executor": "@nrwl/workspace:run-commands",
      "outputs": [],
      "options": {
        "command": "node dist/apps/my-project/main.js"
      }
    }

然后可以通过以下方式执行:

nx run my-project:run-script

感谢 alessiopremoli 和 Dharman 为我指明了正确的方向。

六个月后,我回到了这个问题,我的旧答案和同时添加的另一个答案都不适用于我的(新)案例:我必须运行一个脚本,其中包含来自 nx monorepo 的特定导入。 在挖掘更新后,我想出了一个新的解决方案。

主要思想是将您的 app / lib 相关脚本存储在与它们相关的项目文件夹的子文件夹中,然后添加到workspace.jsonproject.json此文件夹的特定构建命令,例如:

{
    "_build_scripts": {
        "executor": "@nrwl/node:build",
        "outputs": [
            "{options.outputPath}"
        ],
        "options": {
            "outputPath": "dist/libs/my-project-path",
            "tsConfig": "libs/my-project-path/tsconfig.lib.json",
            "packageJson": "libs/my-project-path/package.json",
            "main": "libs/my-project-path/scripts/myscript.ts",
            "assets": ["if needed"]
        }
    }
}

然后你可以设置你的运行脚本命令,总是在workspace.jsonproject.json中:

{
  "run-script": {
    "executor": "@nrwl/workspace:run-commands",
    "configurations": {
      "my-script": {
        "commands": [
          "./node_modules/.bin/nx run my-project:_build_script",
          "node dist/my-project-path/main.js"
        ],
        "parallel": false
      }
    }
  }
}

要记住两件事: parallel设置为 false 是强制性的,您需要在执行脚本之前执行构建步骤; 就我而言,在node main.js之前,我必须在目录中 cd,因为fs正在读取一些解析与 monorepo 根目录不兼容的路径的文件。

最后你可以运行:

npx nx run my-project:run-script:my-script

我有类似的情况,我想运行一次nx 节点应用程序来执行任务,结果是 output。 我将此附加到我的应用程序的目标中:

// project.json

{
  "$schema": "../../node_modules/nx/schemas/project-schema.json",
  "sourceRoot": "apps/app-name/src",
  "projectType": "application",
  "targets": {
    ...
    "run": {
      "executor": "@nrwl/workspace:run-commands",
      "options": {
        "commands": [
          "nx run app-name:build:production",
          "node dist/apps/app-name/main.js"
        ]
      }
    }
  },
  "tags": []
}

然后运行应用程序一次: nx run app-name:run

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM