Firebase-tools: firebase serve - только функции, а не горячая перезагрузка

Созданный на 1 мая 2018  ·  43Комментарии  ·  Источник: firebase/firebase-tools

Информация о версии

firebase --version
3.18.4

Информация о платформе

Ubuntu 18.04 x64

Действия по воспроизведению

  1. Проект облачных функций Firebase с TypeScript с использованием пряжи
  2. сборка пряжи - смотреть
  3. Просмотр функции HTTPS в браузере
  4. Ответ функции обновления
  5. Обновить страницу в браузере

Ожидаемое поведение

Браузер отображает обновленное содержимое

Фактическое поведение

Страница обновляется только после перезапуска команды firebase serve. Я подтвердил, что вывод в lib обновлен.

> firebase serve --only functions --debug                                                                                                                                                             [17:29:27]
[2018-05-01T00:29:30.975Z] ----------------------------------------------------------------------
[2018-05-01T00:29:30.978Z] Command:       /home/shane/.nvm/versions/node/v6.11.5/bin/node /home/shane/.yarn/bin/firebase serve --only functions --debug
[2018-05-01T00:29:30.978Z] CLI Version:   3.18.4
[2018-05-01T00:29:30.979Z] Platform:      linux
[2018-05-01T00:29:30.979Z] Node Version:  v6.11.5
[2018-05-01T00:29:30.979Z] Time:          Mon Apr 30 2018 17:29:30 GMT-0700 (PDT)
[2018-05-01T00:29:30.979Z] ----------------------------------------------------------------------

[2018-05-01T00:29:30.986Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2018-05-01T00:29:30.986Z] > authorizing via signed-in user
[2018-05-01T00:29:30.988Z] >>> HTTP REQUEST GET https://admin.firebase.com/v1/projects/nativ-dev  

 Mon Apr 30 2018 17:29:30 GMT-0700 (PDT)
[2018-05-01T00:29:31.433Z] <<< HTTP RESPONSE 200 server=nginx, date=Tue, 01 May 2018 00:29:31 GMT, content-type=application/json; charset=utf-8, content-length=128, connection=close, x-content-type-options=nosniff, strict-transport-security=max-age=31536000; includeSubdomains, cache-control=no-cache, no-store
[2018-05-01T00:29:31.437Z] >>> HTTP REQUEST GET https://admin.firebase.com/v1/database/nativ-dev/tokens  

 Mon Apr 30 2018 17:29:31 GMT-0700 (PDT)
[2018-05-01T00:29:31.926Z] <<< HTTP RESPONSE 200 server=nginx, date=Tue, 01 May 2018 00:29:31 GMT, content-type=application/json; charset=utf-8, content-length=256, connection=close, x-content-type-options=nosniff, strict-transport-security=max-age=31536000; includeSubdomains, cache-control=no-cache, no-store
[2018-05-01T00:29:31.927Z] >>> HTTP REQUEST GET https://cloudresourcemanager.googleapis.com/v1/projects/nativ-dev  

 Mon Apr 30 2018 17:29:31 GMT-0700 (PDT)
[2018-05-01T00:29:32.335Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Tue, 01 May 2018 00:29:32 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=hq=":443"; ma=2592000; quic=51303433; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="43,42,41,39,35", accept-ranges=none, connection=close

=== Serving from '/home/shane/source/firebase'...

i  functions: Preparing to emulate functions.
[2018-05-01T00:29:32.733Z] Fetching environment
[2018-05-01T00:29:32.736Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/766196581577:getServerAppConfig

 Mon Apr 30 2018 17:29:32 GMT-0700 (PDT)
[2018-05-01T00:29:33.255Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Tue, 01 May 2018 00:29:33 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=hq=":443"; ma=2592000; quic=51303433; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="43,42,41,39,35", accept-ranges=none, connection=close
[2018-05-01T00:29:33.256Z] Starting @google-cloud/functions-emulator
[2018-05-01T00:29:34.318Z] Parsing function triggers
i  functions: No HTTPS functions found. Use firebase functions:shell if you would like to emulate other types of functions.
i  functions: No HTTPS functions found. Use firebase functions:shell if you would like to emulate other types of functions.
✔  functions: createCustomerOnCall: http://localhost:5000/nativ-dev/us-central1/createCustomerOnCall
✔  functions: createCustomerHttps: http://localhost:5000/nativ-dev/us-central1/createCustomerHttps
info: User function triggered, starting execution
info: Execution took 19 ms, user function completed successfully
info: User function triggered, starting execution
info: Execution took 1 ms, user function completed successfully
functions bug

Самый полезный комментарий

На случай, если здесь останутся другие, вот как настроить его в functions/package.json чтобы tsc -w запускался отдельно от firebase serve :

{
  "name": "functions",
  "scripts": {
...
    "serve": "tsc -w | firebase serve --only functions",
...
  },

Другими словами, запустите tsc -w и направьте вывод в firebase serve . Я не думаю, что труба действительно что-то отправляет; Я думаю, что при изменении источника tsc перезапускается, и firebase serve наблюдает tsc выходным каталогом lib ), поэтому он перезагружается. Так что труба действительно нужна только для управления процессами.

Все 43 Комментарий

Я только что попробовал это на другой машине (Debian Stretch) со свежим проектом (firebase init), и то же самое произошло с функцией hello world. Я заметил, что если бы я изменил источник перед отправкой запроса функции, но после того, как функция была готова к работе, я мог бы один раз выполнить горячую перезагрузку, а затем перестал бы работать снова.

Я попытался создать новый проект (firebase init) на Mac и Linux. Он работает на Mac, а не на Linux.

Я немного поэкспериментировал и смог получить горячую перезагрузку примера hello world в JavaScript, но не пример TypeScript. Похоже, что firebase serve наблюдает только за index.js в каталоге, настроенном в `firebase.json.

Чтобы перезагрузить мой проект для TypeScript (и я предполагаю, что более сложные макеты JavaScript имеют больше, чем просто index.js ), мне пришлось использовать Webpack для вывода одного файла functions/lib/index.js и настроить Firebase для поиска моих код функций в functions/list . После этого выполняется горячая перезагрузка как для firebase functions:shell и для firebase serve .

Когда я использовал tsc (согласно шаблону firebase init ), код перезагружался только в том случае, если я изменял полученный файл index.js . Мой текущий рабочий процесс - запустить webpack --watch в одном терминале с firebase serve --only functions в другом. Теперь у меня горячая перезагрузка. Было бы хорошо, если бы я мог вернуться к значениям по умолчанию с firebase init .

Обновлен firebase.json

{    
  "functions": {
    "predeploy": "npm --prefix functions run build",
    "source": "functions/list"
  }
}

@safarmer Как main ?

Я начал использовать значение по умолчанию, сгенерированное firebase init

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc --project tsconfig.json",
    "serve": "yarn run build && firebase serve --only functions",
    "shell": "yarn run build && firebase functions:shell",
    "start": "yarn run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "main": "lib/index.js",
  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  },
  "private": true
}

Самый простой способ воспроизвести проблему:

  1. firebase init && cd functions && yarn
  2. Раскомментируйте функцию helloWorld
  3. mkdir src/handlers && mv src/index.ts src/handlers/helloworld.ts
  4. echo "export * from './handlers/helloworld';" > src/index.ts
  5. В терминале 1: yarn build --watch
  6. В терминале 2: firebase serve --only functions

Посетив URL-адрес в браузере, вы увидите сообщение hello world. Если вы измените строку, возвращаемую обработчиком в handler.ts, единственный способ получить результат для изменения - это перезапустить команду firebase serve .

Добавление "source": "functions/lib" к firebase.json вызывает горячую перезагрузку кода, если вы измените что-либо в functions/lib но каталоги нижнего уровня не запускают перезагрузку. Можно запустить touch lib/injex.js чтобы запустить перезагрузку. Например, изменение обработчика в триггерах src/index.ts вызывает перезагрузку, а изменение src/handlers/helloworld.ts - нет.

@laurenzlong лучшее, что у меня есть до сих пор (взято из результата инициализации touch lib/index.js . Другая проблема заключается в том, что firebase deploy больше не работает.

firebase.json

{
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint",
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ],
    "source": "functions/lib"
  }
}

функции / package.json

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "main": "lib/index.js",
  "dependencies": {
    "firebase-admin": "~5.12.0",
    "firebase-functions": "^1.0.1"
  },
  "devDependencies": {
    "tslint": "^5.8.0",
    "typescript": "^2.5.3"
  },
  "private": true
}

@laurenzlong У меня есть простой пример, который вы можете клонировать, чтобы воспроизвести проблему в Linux:
https://github.com/safarmer/firebase-functions

Спасибо за репродукцию! Я посмотрю на следующей неделе.

Такая же проблема здесь :)
Мне кажется, что firebase serve пока не поддерживает Typescript ...

Я сравнил файлы, которые вы просили, с теми, что отправил

Я думаю, что проблема в том, что firebase serve не отслеживает изменения в каталоге «исходный код» функций и не запускает сценарии предварительного развертывания, определенные в firebase.json .

Было бы здорово, если бы это добавили. : D

Ах, и было бы здорово, если бы я мог определить другие сценарии предварительного развертывания для firebase serve, поэтому мне не придется запускать, например, tslint при тестировании :)

@IchordeDionysos Я не думаю, что это просто TypeScript. Я попытался сделать то же самое, что и мой пример, на JavaScript, и, похоже, он сделал то же самое. Я думаю, что проблема в том, что сервер смотрит только на точку входа, а не на остальную часть кода. Надеюсь, команда firebase вскоре сможет пролить свет на эту проблему.

@laurenzlong ручная установка сторожа, похоже, заставляет все работать (спасибо @tstirrat за предложение)

Спасибо за подробное изображение @safarmer , очень полезно. Мне удалось отследить корень проблемы и подать https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/207. Пожалуйста, следите за этой проблемой.

Для других, приходящих сюда, установите watchman из исходников или Linuxbrew , а не пакет npm.

@laurenzlong Я могу воспроизвести эту проблему в Windows, и, в частности, изменение index.ts не обнаруживается. Мне нужно вручную запустить tsc. Затем изменение обнаруживается, и функция перезагружается.
Стоит ли открывать отдельный выпуск?

быстрые примечания: иногда info: Worker for helloWorld closed due to file changes. обнаруживается на ts, но lib не обновляется. в других случаях его вообще не обнаруживают. запуск tsc вручную всегда перезагружает функцию.

@tstirrat установка сторожа на окна в соответствии с инструкциями, похоже, не работает

С какими ошибками конкретно вы сталкиваетесь при установке сторожа?

Никаких ошибок при установке сторожа. Но обслуживающие функции не горячие
перезагрузить. Я должен перестать служить, строить и снова служить после каждого изменения.

В среду, 21 ноября 2018 г., в 1:01 Кевин Цзянь [email protected] написал:

С какими ошибками конкретно вы сталкиваетесь при установке сторожа?

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/firebase/firebase-tools/issues/758#issuecomment-440460196 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AHgHbeA_iECsIMH3V9P7NQypsmudF_IQks5uxInggaJpZM4Tta12
.

Повторное открытие из-за нескольких сообщений об этом по-прежнему не работает в Windows

Все еще не работает в Ubuntu 18.04 с Node.js v10.15.0

Моя проблема была связана с эмулятором:
https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196

Всем привет, спасибо за подробные отчеты. @afuggini Когда я нажимаю на эту ссылку, я получаю сообщение 404. Правильно ли установлены разрешения для этого репо для публичного просмотра? Есть еще одна проблема, похожая на эту: https://github.com/firebase/firebase-tools/issues/1022. Я слышал, что эта проблема создает проблему для локальной разработки с помощью Typescript.

Я зарегистрировал ошибку в нашем внутреннем трекере: 123266946. Я не могу сказать, когда мы сможем это сделать, но знаю, что это отслеживается. PR приветствуются!

Я тоже столкнулся с этой ошибкой. Мне не удалось найти обходной путь, поэтому мне приходится перезапускать сервер после каждого изменения. Если вы знаете надежное решение, сообщите мне.

@ondratra, можете ли вы npm (например, yarn )?

@bkendall Я использую Debian (sid). Исходные файлы Typescript просматриваются и компилируются с помощью tsc -w + функции обслуживаются с помощью firebase --only functions serve . package.json содержит правильный путь к
js выходной файл {"main": "dist/src/index.js", ...} . Я даже пытался использовать tsc-watch package и явно touch index файл, но безуспешно.

$ firebase --version
6.3.1

Ребята, проверьте мой предыдущий комментарий. Проблема связана с cloud-functions-emulator . Он использует функцию fs watch, которая имеет известную проблему в Linux. Так что не ждите решения напрямую от firebase-tools.

@ribizli thx, ссылка, которой вы поделились, наверняка объясняет природу проблемы. Но я все еще не нашел обходного пути. Есть ли возможность смотреть файлы через собственный скрипт и принудительно перезагружать firebase?

@ondratra fork @google-cloud/functions-emulator , добавьте node-watch как я упоминал в моем связанном комментарии, npm link пакет. Переустановите firebase-tools : у него есть @google-cloud/functions-emulator качестве необязательной зависимости, поэтому будет использоваться ваша связанная версия.

И наконец: вы можете написать PR на https://github.com/GoogleCloudPlatform/cloud-functions-emulator и надеяться, что они скоро примут и выпустят. (Я мог бы жить со своим обходным путем, поэтому я не участвовал)

functions -> index.js после сохранения этого файла, как я могу запустить автозапуск "firebase serve"

Обходной путь с https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196 (спасибо @dirkjot):

У меня это сработало, вот полные инструкции и исправление небольшой опечатки @ribizli :

  • Найдите свой каталог @google-cloud , вероятно, в вашем node_modules (см. Ниже для Firebase)
  • cd functions-emulator
  • Добавить наблюдение за узлами: npm install --save node-watch
  • Отредактируйте файл src/supervisor/worker.js
  • Около 180-й строки вы найдете fs.watch(localdir, { . Замените это на require('node-watch')(localdir, { .

Используя Firebase с машинописным текстом, все, что мне нужно сделать, это запустить tsc -w в отдельном терминале (вариант просмотра npm run build ). Теперь я могу изменить свой исходный код, и эмулятор заметит изменения.

Если вы установили firebase глобально, вы можете найти эти файлы, перейдя к cd $(npm root -g)/firebase-tools/node_modules/@google-cloud .

Эй, ребята -

Эта ошибка связана с возможностью горячей перезагрузки устаревшего эмулятора Cloud Functions. С мая 1919 года мы больше не используем google-cloud/functions-emulator в firebase-tools поэтому это меняет характер ошибки (я считаю, что новая природа заключается в том, что ее не существует).

Я ценю всех, кто усердно работает и ищет обходные пути, и, наконец, наш новый эмулятор должен позволять горячую перезагрузку любых перенесенных языков, пока вы запускаете свой наблюдатель (например, tsc -w ) отдельно от firebase serve .

С помощью нового бэкэнда эмулятора мы решили эту проблему, и теперь все обходные пути в этом потоке устарели, поэтому я собираюсь закрыть этот поток, чтобы избежать путаницы.

Если вы по-прежнему наблюдаете какое-либо непреднамеренное поведение, пожалуйста, откройте новую ошибку.

Еще раз спасибо!

На случай, если здесь останутся другие, вот как настроить его в functions/package.json чтобы tsc -w запускался отдельно от firebase serve :

{
  "name": "functions",
  "scripts": {
...
    "serve": "tsc -w | firebase serve --only functions",
...
  },

Другими словами, запустите tsc -w и направьте вывод в firebase serve . Я не думаю, что труба действительно что-то отправляет; Я думаю, что при изменении источника tsc перезапускается, и firebase serve наблюдает tsc выходным каталогом lib ), поэтому он перезагружается. Так что труба действительно нужна только для управления процессами.

У меня сработала одновременная установка:

"build:watch": "tsc -w && cp src/*.json lib",
"serve": "firebase serve --only functions",
"start": "concurrently \"npm run build:watch\" \"npm run serve\"",

У меня на [email protected] горячая перезагрузка из коробки не работает. Я изменил build в functions/package.json на tsc -w как

{
  "name": "functions",
  "scripts": {
   ...
      "build": "tsc -w",
   ...
  },

Это будет держать часы активными для функций, когда я запускаю npm run build , а затем из another terminal я запускал firebase emulators:start .

@ rami-alloush я тоже использую этот рабочий процесс. Эмуляторы не перестраивают ваш код, но они выполняют горячую перезагрузку собранного кода.

другая версия

{
    "build": "tsc -w &>/dev/null &",
    "shell": "npm run build && firebase functions:shell",
}

это запускает tsc в фоновом режиме и тихо, поэтому вам не нужен другой терминал.

Спасибо за репродукцию! Я посмотрю на следующей неделе.

Это?

Столкнувшись с той же проблемой с машинописным текстом, горячая перезагрузка не работает.

то же самое ... горячая перезагрузка не работает, и эмулятор вообще сложно заставить распознавать изменения ...

@oluckyman решил проблему. очень хорошо

https://github.com/firebase/firebase-tools/issues/758#issuecomment -620096052

[ОБНОВЛЕНО]

  • firebase-tools => 8.7.0

Мое решение:

package.json

...
 "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc -w --preserveWatchOutput",
    "serve": "tsc && firebase emulators:exec --ui --only functions,firestore 'yarn build'",
    "shell": "yarn run build && firebase functions:shell",
    "start": "yarn run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
...

Запустить yarn serve

Демо

Aug-06-2020 14-05-38

На данный момент это отлично работает для меня в firebase-tools версии 8.8.1 с использованием машинописного текста. Спасибо за советы, ребята @moifort @garyo @safarmer @abeisgoat : 1st_place_medal::

"scripts": {
    ...
    ...
    "serve": "yarn build | firebase emulators:start --only functions",
    "build": "./node_modules/.bin/tslint --project tsconfig.json && ./node_modules/.bin/tsc --watch --preserveWatchOutput"
  },
Была ли эта страница полезной?
0 / 5 - 0 рейтинги