1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-TensorFlowjs

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
BAZEL_MIGRATION.md 35 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 14.03.2025 10:54 95ac927

Миграция в Bazel

Данный документ подробно описывает шаги по миграции пакета на сборку с использованием Bazel. Эти шаги легче всего понять на примере работающего проекта, поэтому данный документ использует настройки tfjs-core как можно чаще. Поскольку миграция ещё находится в процессе, шаги и процессы, указанные здесь, могут меняться по мере нашего улучшения процесса, добавления новых возможностей к сборке каждого пакета и создания специфичных функций сборки для tfjs.

Область применения

Миграция пакета в Bazel включает добавление целей Bazel для сборки пакета, запуска его тестов и упаковки пакета для публикации на npm. Чтобы облегчить переход на Bazel, мы постепенно переводим пакеты на сборку с использованием Bazel, начиная с корневых пакетов (tfjs-core, tfjs-backend-cpu) и постепенно расширяясь до листовых пакетов. Это отличается от нашей первоначальной стратегии поддержания текущего способа сборки и нового способа сборки с помощью Bazel параллельно, что в конечном итоге не работало из-за некоторых изменений, необходимых Bazel в исходных файлах TypeScript.## Ограничения

  • Bazel будет использовать зависимость или файл только если вы явно объявите её как зависимость / входной параметр правила, которое вы используете.
  • Все сборки Bazel используют корневой файл package.json, поэтому вам может потребоваться добавить пакеты в него. В случае использования @npm//имя_зависимости в файлах BUILD для добавления зависимостей, вам не придётся беспокоиться о том, чтобы сборка случайно видела директорию node_modules пакета вместо корневой директории node_modules. Bazel будет видеть только корневую директорию node_modules.
    • Хотя сборка не использует директорию node_modules пакета, вам может потребоваться выполнить команду yarn внутри пакета, чтобы получить правильное завершение кода для автодополнения. Мы исследуем причины этого поведения.
  • Может возникнуть проблема при зависимости от явно закрепленных версий @tensorflow ограниченных пакетов, что может повлиять на некоторые демонстрационные примеры, если они будут мигрированы для использования Bazel. Возможно, нам стоит исключить демонстрационные примеры из сборки Bazel, чтобы они были проще для понимания.## Шаги Эти шаги являются общими руководствами для сборки пакета с использованием Bazel. Они должны работать для большинства пакетов, но могут быть исключения (например, wasm, react native).

Убедитесь, что все зависимости собираются с использованием Bazel

Зависимости пакета должны быть перенесены перед тем, как сам пакет будет перенесён. Проверьте задачу пакета, которую можно найти, проверив #5287, чтобы найти его зависимости.

Добавьте зависимости в корневой package.json

Bazel (через rules_nodejs) использует единственный корневой package.json для своих зависимостей npm. При конвертации пакета для сборки с помощью Bazel зависимости в package.json пакета должны быть добавлены в корневой package.json.

Создайте файл BUILD.bazel в корне пакета

Bazel ищет цели для выполнения в файлах BUILD и BUILD.bazel. Используйте расширение .bazel, так как Blaze использует BUILD. Вы можете захотеть установить расширение для вашего редактора, чтобы получить выделение синтаксиса. Здесь доступно расширение для VSCode.

Этот файл BUILD будет управлять правилами уровня пакета, такими как упаковка для npm.

Создайте ещё один файл BUILD.bazel в директории src

Этот файл BUILD будет компилировать исходные файлы пакета с использованием ts_library и может также определять тестовые пакеты.### Компилируйте пакет с помощью ts_library В файле BUILD.bazel в директории src мы используем ts_library для компиляции файлов TypeScript пакета. ts_library — это правило, предоставляемое rules_nodejs. Мы оборачиваем ts_library в макрос, который устанавливает некоторые проектные настройки.

Вот пример того, как tfjs-core использует ts_library для сборки.

tfjs-core/src/BUILD.bazel

load("//tools:defaults.bzl", "ts_library")

TEST_SRCS = [
    "**/*_test.ts",
    "image_test_util.ts",
]

# Компилирует большую часть tfjs-core с использованием модуля `@tensorflow/tfjs-core/dist`.
ts_library(
    name = "tfjs-core_src_lib",
    srcs = glob(
        ["**/*.ts"],
        exclude = TEST_SRCS + ["index.ts"],
    ),
    module_name = "@tensorflow/tfjs-core/dist",
    deps = [
        "@npm//@types",
        "@npm//jasmine-core",
        "@npm//seedrandom",
    ],
)
```# Компилирует входной файл `index.ts` из `tfjs-core` отдельно от остальных источников,
# чтобы использовать имя модуля `@tensorflow/tfjs-core` вместо `@tensorflow/tfjs-core/dist`.
ts_library(
    name = "tfjs-core_lib",
    srcs = ["index.ts"],
    module_name = "@tensorflow/tfjs-core",
    deps = [
        ":tfjs-core_src_lib",
    ],
)

ts_library используется дважды для обеспечения правильного имени модуля для выходных файлов. Большинство файлов импортируются относительно @tensorflow/tfjs-core/src/, но index.ts, входной точки tfjs-core, должна быть импортирована как @tensorflow/tfjs-core. Если ваш пакет импортируется из dist (например, import {} from @tensorflow/tfjs-core/dist/ops/ops_for_converter), этот импорт вероятнее всего соответствует правилу в файле src/BUILD.bazel этого пакета. Найдите правило, которое включает импортируемый файл и правильно настроено значение module_name для данного импорта.### Упаковка пакета Этот шаг включает упаковку скомпилированных файлов из этапа компиляции в один файл, а правила добавляются в корневой файл BUILD пакета (вместо src/BUILD.bazel). Чтобы поддерживать различные среды выполнения, TFJS генерирует несколько пакетов для каждого пакета. Мы предоставляем макрос tfjs_bundle для создания этих пакетов.

tfjs-core/BUILD.bazel

load("//tools:tfjs_bundle.bzl", "tfjs_bundle")

tfjs_bundle(
    name = "tf-core",
    entry_point = "//tfjs-core/src:index.ts",
    external = [
        "node-fetch",
        "util",
    ],
    umd_name = "tf",
    deps = [
        "//tfjs-core/src:tfjs-core_lib",
        "//tfjs-core/src:tfjs-core_src_lib",
    ],
)

Макрос tfjs_bundle создаёт несколько различных пакетов, которые публикуются на этапе публикации пакета.

Компиляция тестов с помощью ts_library

В файле src/BUILD.bazel мы компилируем тесты с помощью ts_library. В случае tfjs-core мы фактически публикуем файлы тестов, так как они используются другими пакетами в своих тестах. Поэтому важно установить значение module_name на @tensorflow/tfjs-core/dist. Если тесты пакета не публикуются, можно скорее всего пропустить установку значения module_name. В будущей значительной версии tfjs мы можем прекратить публикацию тестов в npm.

tfjs-core/src/BUILD.bazel

load("//tools:defaults.bzl", "ts_library")
``````md
### Обновите точку входа для тестов
Многие пакеты имеют файл `src/run_tests.ts` (или аналогичный), который они используют для выбора тестов для выполнения. Этот файл определяет пути к файлам с тестами, используемым Jasmine. Поскольку выходные данные Bazel располагаются в другом месте, пути к файлам с тестами должны быть обновлены. Например, следующие пути
```ts
const coreTests = 'node_modules/@tensorflow/tfjs-core/src/tests.ts';
const unitTests = 'src/**/*_test.ts';

необходимо будет обновить до

const coreTests = 'tfjs-core/src/tests.js';
const unitTests = 'the-package-name/src/**/*_test.js';

Обратите внимание, что .ts был заменен на .js. Это связано с тем, что мы больше не выполняем тесты Node с помощью ts-node, поэтому входные файлы с тестами теперь являются выходными файлами .js, созданными правилом ts_library, которое скомпилировало эти тесты. Также важно убедиться, что правило nodejs_test, выполняющее тестирование, имеет [link_workspace_root = True](https://bazelbuild.github.io/rules_nodejs/Built-ins.html#nodejs_binary-link_workspace_root). В противном случае, тестовые файлы не будут доступны в режиме выполнения.

Наша конфигурация тестирования позволяет точно настраивать, какие именно тесты будут запущены через `setTestEnvs` и `setupTestFilters` в файле `jasmine_util.ts`, который используется в пользовательском файле входа Jasmine `setup_test.ts`. Эта конфигурация плохо работает вместе с [jasmine_node_test](https://bazelbuild.github.io/rules_nodejs/Jasmine.html#jasmine_node_test), которая предоставляет свой собственный файл входа для запуска Jasmine. Вместо этого мы используем правило [nodejs_test](https://bazelbuild.github.io/rules_nodejs/Built-ins.html#nodejs_test).

`tfjs-core/BUILD.bazel`
```starlark
load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "nodejs_test")

# Это необходимо для того, чтобы тесты имели доступ к
# файлу package.json, так как src/version_test.ts использует 'require()' для его чтения.
js_library(
    name = "package_json",
    srcs = [
        ":package.json",
    ],
)

nodejs_test(
    name = "tfjs-core_node_test",
    data = [
        ":package_json",
        "//tfjs-backend-cpu/src:tfjs-backend-cpu_lib",
        "//tfjs-core/src:tfjs-core_lib",
        "//tfjs-core/src:tfjs-core_src_lib",
        "//tfjs-core/src:tfjs-core_test_lib",
    ],
    entry_point = "//tfjs-core/src:test_node.ts",
    link_workspace_root = True,
    tags = ["ci"],
)

Важно помечать тесты тегом ci, если вы хотите, чтобы они выполнялись в процессе непрерывной интеграции.

Выполнение браузерных тестов с помощью karma_web_test

Мы используем esbuild для сборки тестов в один файл.

tfjs-core/src/BUILD.bazel

load("//tools:defaults.bzl", "esbuild")
```esbuild(
    name = "tfjs-core_test_bundle",
    testonly = True,
    entry_point = "setup_test.ts",
    external = [
        # тесты WebWorker вызывают 'require("@tensorflow/tfjs")',
        # который является внешним относительно пакета тестов.
        # Примечание: это не целевой объект Bazel. Это просто строка.
        "@tensorflow/tfjs",
        "worker_threads",
        "util",
    ],
    sources_content = True,
    deps = [
        ":tfjs-core_lib",
        ":tfjs-core_test_lib",
        "//tfjs-backend-cpu/src:tfjs-backend-cpu_lib",
        "//tfjs-core:package_json",
    ],
)

```Сборка esbuild затем используется в макроопределении tfjs_web_test, которое использует [karma_web_test](https://bazelbuild.github.io/rules_nodejs/Concatjs.html#karma_web_test) для предоставления его браузеру для выполнения. Разные браузеры BrowserStack можно включать или отключать с помощью аргумента `browsers`, а полный список браузеров находится в `tools/karma_template.conf.js`. Тесты BrowserStack автоматически маркируются как `ci`.````tfjs-core/BUILD.bazel`
```starларк
load("//tools:tfjs_web_test.bzl", "tfjs_web_test")

tfjs_web_test(
    name = "tfjs-core_test",
    srcs = [
        "//tfjs-core/src:tfjs-core_test_bundle",
    ],
    browsers = [
        "bs_chrome_mac",
        "bs_firefox_mac",
        "bs_safari_mac",
        "bs_ios_12",
        "bs_android_10",
        "win_10_chrome",
    ],
    static_files = [
        # Here are the files to ensure that source mapping tables are available
        "//tfjs-core/src:tfjs-core_test_bundle",
        # For web worker
        ":tf-core.min.js",
        ":tf-core.min.js.map",
        "//tfjs-backend-cpu:tf-backend-cpu.min.js",
        "//tfjs-backend-cpu:tf-backend-cpu.min.js.map",
    ],
)

Ранее тесты включались на основе файла конфигурации karma.conf.js, но теперь тесты должны быть включены в тестовый пакет для выполнения. Убедитесь, что вы импортировали каждый тестовый файл в точке входа тестового пакета. Для помощи с этим мы предоставляем правило Bazel enumerate_tests для генерации файла tests.ts с необходимыми импортами.

tfjs-core/src/BUILD.bazel

load("//tools:enumerate_tests.bzl", "enumerate_tests")
```# Генерирует файл 'tests.ts', который импортирует все точки входа тестов.
enumerate_tests(
    name = "tests",
    srcs = [":all_test_entrypoints"], # all_test_entrypoints является группой файлов
    root_path = "tfjs-core/src",
)
```### Обновление файла package.json
1. Убедитесь, что точки входа в файле package.json совпадают с выходами, сгенерированными командами `tfjs_bundle` и `ts_library`. Пример можно найти в файле [tfjs-core/package.json](https://github.com/tensorflow/tfjs/blob/a32cc50dbd0dce2e6a53bb962eedc0d87a064b1e/tfjs-core/package.json#L6-L12).
   1. Основная точка входа должна указывать на пакет для Node.js, `dist/tf-package-name.node.js`.
   2. Поля `jsnext:main` и `module` должны указывать на выход ESModule `dist/index.js`, созданный командой `copy_ts_library_to_dist`.
2. Если пакет имеет браузерные тесты, обновите поле `sideEffects`, чтобы включить файлы `.mjs`, сгенерированные командой `ts_library` в директории `. /src` (например, `src/foo.mjs`). Bazel выдает прямым образом в `src`, хотя мы копируем эти выходы в `dist` с помощью другой команды Bazel, браузерные тестовые пакеты всё ещё импортируют из `src`, поэтому нам нужно пометить их как `sideEffects`.

### Пакет для npm
Мы используем правило [pkg_npm](https://bazelbuild.github.io/rules_nodejs/Built-ins.html#pkg_npm) для создания и публикации пакета в npm. Однако, перед тем как объявить пакет, требуется выполнить несколько шагов. Для большинства пакетов мы распространяем все наши скомпилированные выходные данные в директории `dist`.Однако из-за того, как работает правило `ts_library`, оно создает выходные данные в том же каталоге, откуда были скомпилированы исходные файлы (кроме того, они появляются в выводной директории Bazel `dist-bin`). Нам нужно скопировать эти файлы из `src` в `dist`, при этом гарантируя, что Bazel осведомлен об этой операции копирования (чтобы мы могли продолжать использовать `pkg_npm`).Нам также нужно скопировать несколько других файлов в `dist`, таких как бандлы, созданные с помощью `tfjs_bundle`, а также создать [miniprogram](https://walkthechat.com/wechat-mini-programs-simple-introduction/) файлы для WeChat.

Для копирования файлов обычно используется правило `copy_to_dist`. Это правило создает символические ссылки на все файлы в `srcs` и помещает их в дерево файлов с такой же структурой в `dest_dir` (по умолчанию это `dist`).

Однако просто скопировать выходные данные правила `ts_library` невозможно, так как его стандартные выходные данные — это файлы объявлений `.d.ts`. Нам нужно извлечь желаемые модули ES `.mjs` и переименовать их, чтобы они имели расширение `.js`. Правило `copy_ts_library_to_dist` выполняет эту переименовку и также копирует файлы в `dist` (включая файлы объявлений `.d.ts`).

```starlark
load("//tools:copy_to_dist.bzl", "copy_ts_library_to_dist")

copy_ts_library_to_dist(
    name = "copy_src_to_dist",
    srcs = [
        "//tfjs-core/src:tfjs-core_lib",
        "//tfjs-core/src:tfjs-core_src_lib",
        "//tfjs-core/src:tfjs-core_test_lib",
    ],
    root = "src", # Рассматриваем 'src' как корневую директорию копирования
                  # (то есть создается 'dist/index.js' вместо 'dist/src/index.js').
    dest_dir = "dist", # Куда копировать файлы. По умолчанию это 'dist', поэтому этот параметр можно опустить в данном случае.
)

Можно также скопировать бандлы, созданные с помощью tfjs_bundle.```starlark copy_to_dist( name = "copy_bundles", srcs = [ ":tf-core", ":tf-core.node", ":tf-core.es2017", ":tf-core.es2017.min", ":tf-core.fesm", ":tf-core.fesm.min", ":tf-core.min", ], )

Копируем файлы минифицированной программы, используя правило `copy_file`, которое копирует отдельный файл в указанное место.```starlark
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")

copy_file(
    name = "copy_miniprogram",
    src = ":tf-core.min.js",
    out = "dist/miniprogram/index.js",
)

copy_file(
    name = "copy_miniprogram_map",
    src = ":tf-core.min.js.map",
    out = "dist/miniprogram/index.js.map",
)

Теперь, когда все файлы скопированы, мы можем объявить pkg_npm

load("@build_bazel_rules_nodejs//:index.bzl", "pkg_npm")

pkg_npm(
    name = "tfjs-core_pkg",
    package_name = "@tensorflow/tfjs-core",
    srcs = [
        # Добавьте любые статические файлы, которые пакет должен содержать здесь
        "package.json",
        "README.md",
    ],
    tags = ["ci"],
    deps = [
        ":copy_bundles",
        ":copy_miniprogram",
        ":copy_miniprogram_map",
        ":copy_src_to_dist",
        ":copy_test_snippets", # <- Это только в core, поэтому опущено его определение в этих документах.
    ],
)

Теперь пакет можно опубликовать на npm с помощью команды bazel run //tfjs-core:tfjs-core_pkg.publish.

Настройка публикации на npm

С использованием правила pkg_npm, добавляем скрипт в package.json для его запуска. Этот скрипт будет использоваться основным скриптом, который публикует монорепозиторий.

{
    "scripts": {
        "publish-npm": "bazel run :tfjs-core_pkg.publish"
    }
}

Теперь, так как мы используем скрипт publish-npm для публикации этого пакета вместо npm publish, нам нужно убедиться, что тесты выпуска и скрипт выпуска знают, как его публиковать.

  1. В scripts/publish-npm.ts, добавьте имя вашего пакета в множество BAZEL_PACKAGES.
  2. В e2e/scripts/publish-tfjs-ci.sh, добавьте имя вашего пакета в список BAZEL_PACKAGES.

Вы также должны добавить скрипт для сборки самого пакета без публикации (используется для link-package).```json "build": "bazel build :tfjs-core_pkg",


### Обновление путей `package.json` в зависимых пакетах

Если ни один пакет не зависит от вашего пакета (то есть ни одно `package.json` файл не ссылается на ваш пакет через зависимость `link`), то вы можете пропустить этот раздел. Как основная особенность своего дизайна, Bazel располагает выходные данные в отдельной директории от источников. Выходные данные ссылаются на `dist/bin/[package-name]/.....` вместо того, чтобы появляться в `[package-name]/dist`. Из-за различия местоположения все последующие пакеты должны обновить свои файлы `package.json`, чтобы указывать на новые выходные данные. Однако из-за некоторых деталей работы Bazel и алгоритма разрешения модулей Node.js, мы не можем напрямую использовать `link:` для выходных данных Bazel. Вместо этого мы поддерживаем псевдо-пакет `link-package`, где копируем выходные данные Bazel. Этот пакет позволяет правильно разрешать модули Node между выходными данными Bazel, так как он имеет свой собственный каталог `node_modules`. Этот пакет никогда не будет опубликован и будет удален после завершения миграции.

#### Добавьте пакет в `link-package`
Добавьте ваш пакет в список `PACKAGES` в скрипте `build_deps.ts` в директории `link-package`. Для пакета с npm-названием `@tensorflow/tfjs-foo` директория пакета в многопроектной системе и значение, которое следует добавить в `PACKAGES`, должны быть одинаковыми — `tfjs- Yöntem foo`. Название цели `pkg_npm` пакета должно быть `tfjs-foo_pkg`.

---

Корректировка:

#### Добавьте пакет в `link-package`
Добавьте ваш пакет в список `PACKAGES` в скрипте `build_deps.ts` в директории `link-package`. Для пакета с npm-названием `@tensorflow/tfjs-foo` директория пакета в многопроектной системе и значение, которое следует добавить в `PACKAGES`, должны быть одинаковыми — `tfjs-foo`. Название цели `pkg_npm` пакета должно быть `tfjs-foo_pkg`.```typescript
const PACKAGES: ReadonlySet<string> = new Set([
  ..., 'tfjs-foo',
]);

Измените пути зависимостей package.json в зависимости от下游依赖项中更改“package.json”路径

更新所有依赖于该包的下游依赖项,使其指向在link-package中的位置。

"devDependencies": {
  "@tensorflow/tfjs-core": "link:../link-package/node_modules/@tensorflow/tfjs-core",
  "@tensorflow/tfjs-foo": "link:../link-package/node_modules/@tensorflow/tfjs-foo",
},

要找到下游包,请运行grep -r --exclude=yarn.lock --exclude-dir=node_modules "link:.*tfjs-foo" .在仓库根目录下。

Удалите скрипт build-tfjs-foo из package.json 在下游包中删除build-tfjs-foo脚本

从下游包的package.json文件中移除build-tfjs-foo脚本。

"scripts": {
  "build-deps": "....... && yarn build-tfjs-foo" // <-- 删除'yarn build-tfjs-foo'。
  "build-tfjs-foo": "remove this script", // <-- 同时在这里也删除它。
}

Переместите проверку стиля в общую команду проверки стиля

Добавьте новый Bazel-пакет в общий конфигурационный файл tslint:

Добавьте отображение путей:

"paths": {
  ...,
  "@tensorflow/the-new-package": ["the-new-package/src/index.ts"],
  "@tensorflow/the-new-package/dist/*": ["the-new-package/src/*"]
}

Также удалите пакет из списка exclude.

Хорошей идеей будет тестировать работоспособность проверки стилей для пакета. Создайте ошибку проверки стиля в одном из его файлов, например const x = "Привет, мир!" (обратите внимание на двойные кавычки), а затем запустите yarn lint в корне репозитория.

Удалите скрипт `lint` из файла `package.json`, файл `tslint.json`, и шаг `lint` из файла `cloudbuild.yml` пакета. Удалите зависимости, связанные с `tslint`, из файла `package.json` пакета и выполните `yarn` для генерации нового файла `yarn.lock`.### Обновление или удаление `cloudbuild.yml`
Обновите `cloudbuild.yml`, чтобы удалить все шаги, которые теперь создаются с помощью Bazel. Эти шаги будут выполнены в рамках шага `bazel-tests`, который выполняется до других шагов пакетов. Любое правило Bazel, помеченное как `ci`, будет тестироваться / строиться в CI.Учтите, что пути вывода созданных Bazel файлов будут отличаться, поэтому любые оставшиеся шаги, которые теперь зависят от выходных данных Bazel, могут потребовать обновления. Выходные данные Bazel расположены в `tfjs/dist/bin/...`.

Если все шаги файла `cloudbuild.yml` теперь обрабатываются Bazel, его можно удалить. Не удаляйте пакет из `tfjs/scripts/package_dependencies.json`.

Перестроите золотые файлы `cloudbuild`, запустив `yarn update-cloudbuild-tests` в корне репозитория.

### Отправка в Git
Перед отправкой в Git запустите линтер Bazel, выполнив команды `yarn bazel:format` и `yarn bazel:lint-fix` в корне репозитория. Мы запускаем линтер в CI, так что если ваша сборка проваливается только в CI, некорректно отформатированные файлы могут быть причиной проблемы.

### Готово!
🎉🎉🎉## Примечания для проверки PR* Убедитесь, что пакет добавлен в `BAZEL_PACKAGES` в [e2e/scripts/publish-tfjs-ci.sh](https://github.com/tensorflow/tfjs/blob/master/e2e/scripts/publish-tfjs-ci.sh#L61).
* Убедитесь, что пакет добавлен в `BAZEL_PACKAGES` в [scripts/publish-npm.ts](https://github.com/tensorflow/tfjs/blob/master/scripts/publish-npm.ts#L31).
* Убедитесь, что пакет, сгенерированный командой `pkg_npm`, содержит все необходимые файлы, такие как README.
* Убедитесь, что пакет добавлен в `package.json` связывающего пакета и что下游包更新为指向链接包的副本而不是包目录。
* Для браузерных тестов может быть полезно проверить, что все желаемые конфигурации браузера будут выполняться ночью в CI.
* Убедитесь, что браузерные тесты включают все требуемые тесты. Правило `enumerate_tests` обычно необходимо для запуска тестов браузером.
* Убедитесь, что возможно больше шагов cloud-build были преобразованы в Bazel, и что эти шаги удалены из файла cloud-build.
* Если сборка и тесты полностью обрабатываются Bazel и не требуют других шагов cloud-build, убедитесь, что файл `cloudbuild.yml` пакета удален. Не удаляйте пакет из [scripts/package_dependencies.json](https://github.com/tensorflow/tfjs/blob/master/scripts/package_dependencies.json).
* Убедитесь, что тесты отмечены как `nightly` или `ci` (`tfjs_web_test` автоматически маркирует тесты как `nightly` и `ci`).
* Убедитесь, что основное правило `pkg_npm` отмечено как `ci` или `nightly`, чтобы все части сборки были протестированы.
* Убедитесь, что скрипты `package.json` обновлены и что `package.json` включает `@bazel/bazelisk` как зависимость для разработки.* Убедитесь, что пакет имеет скрипт `build-npm` и скрипт `publish-npm`. Эти скрипты используются скриптом выпуска.
* Проверьте размеры сгенерированных пакетов и убедитесь, что они не содержат непредвиденные файлы. Проверьте файлы `_stats` для получения информации об этом.
* Убедитесь, что пакет добавлен в [общий tslint tsconfig репозитория](tsconfig_tslint.json) и что его оригинальные скрипты линтера удалены.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-TensorFlowjs.git
git@api.gitlife.ru:oschina-mirror/mirrors-TensorFlowjs.git
oschina-mirror
mirrors-TensorFlowjs
mirrors-TensorFlowjs
master