Firebase-tools: firebase serve --only functions not hot reloading

Criado em 1 mai. 2018  ·  43Comentários  ·  Fonte: firebase/firebase-tools

Informação da versão

firebase --version
3.18.4

Informação da plataforma

Ubuntu 18.04 x64

Passos para reproduzir

  1. Projeto de funções de nuvem do Firebase com TypeScript usando yarn
  2. Yarn build --watch
  3. Ver uma função HTTPS no navegador
  4. Resposta da função de atualização
  5. Atualizar página no navegador

Comportamento esperado

O navegador exibe conteúdo atualizado

Comportamento real

A página só é atualizada após reiniciar o comando firebase serve. Confirmei que a saída em lib foi atualizada.

> 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

Comentários muito úteis

Caso outros acabem aqui, aqui está realmente como configurá-lo em functions/package.json para que tsc -w executado separadamente de firebase serve :

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

Em outras palavras, execute tsc -w e canalize a saída para firebase serve . Não acho que o cachimbo realmente mande alguma coisa; Eu acho que quando a fonte muda, o tsc é executado novamente e firebase serve está observando o dir de saída de tsc ( lib ) então ele recarrega. Portanto, o tubo existe apenas para gerenciamento de processos.

Todos 43 comentários

Acabei de tentar isso em uma máquina diferente (Debian Stretch) com um novo projeto (firebase init) e a mesma coisa aconteceu com a função hello world. Eu percebi que se eu alterasse a fonte antes de enviar uma solicitação para a função, mas depois que a função estivesse pronta para servir, eu poderia carregá-la a quente uma vez e então parar de funcionar novamente.

Eu tentei criar um novo projeto (firebase init) em um Mac e uma máquina Linux, funciona no Mac e não no Linux.

Fiz alguns experimentos e pude obter o exemplo hello world em JavaScript para recarregar a quente, mas não o exemplo TypeScript. Parece que firebase serve apenas observa index.js no diretório configurado em `firebase.json.

Para recarregar meu projeto para TypeScript (e suponho que layouts de JavaScript mais complexos que têm mais do que apenas index.js ), tive que usar o Webpack para gerar um único arquivo functions/lib/index.js e configurar o Firebase para procurar meu código de funções em functions/list . Isso faz com que o hot reload funcione para firebase functions:shell e firebase serve .

Quando eu estava usando tsc (de acordo com o modelo firebase init ), o código só recarregaria se eu modificasse o arquivo index.js resultante. Meu fluxo de trabalho atual é executar webpack --watch em um terminal com firebase serve --only functions em outro. Agora consigo recarregar rapidamente. Seria bom se eu pudesse voltar ao padrão de firebase init .

Firebase.json atualizado

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

@safarmer Qual é a aparência de suas funções / package.json? Ele tem um campo main ?

Comecei a usar o padrão gerado por 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
}

A maneira mais simples que tenho de replicar o problema:

  1. firebase init && cd functions && yarn
  2. Remova o comentário da função helloWorld
  3. mkdir src/handlers && mv src/index.ts src/handlers/helloworld.ts
  4. echo "export * from './handlers/helloworld';" > src/index.ts
  5. No terminal 1: yarn build --watch
  6. No terminal 2: firebase serve --only functions

Visitando a URL em um navegador, você vê a mensagem hello world. Se você alterar a string retornada do manipulador em handler.ts, a única maneira de obter o resultado da alteração é reiniciar o comando firebase serve .

Adicionar "source": "functions/lib" a firebase.json faz com que o código seja recarregado rapidamente se você alterar qualquer coisa em functions/lib mas os diretórios de alavanca inferior não acionam um recarregamento. É possível executar touch lib/injex.js para acionar uma recarga. Por exemplo, alterar um manipulador em src/index.ts dispara a recarga, mas alterar src/handlers/helloworld.ts não.

@laurenzlong, o melhor que tenho até agora (tirado do resultado padrão do firebase init) está abaixo. Com isso, ainda preciso executar touch lib/index.js . Outro problema com isso é que firebase deploy não funciona mais.

firebase.json

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

functions / 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 Tenho um exemplo simples que você pode clonar para reproduzir o problema no Linux:
https://github.com/safarmer/firebase-functions

Obrigado pela reprodução! Vou dar uma olhada na próxima semana.

O mesmo problema aqui :)
Para mim, parece que firebase serve não é compatível com o Typescript agora ...

Eu comparei os arquivos que você pediu com os que o @safarmer enviou e tenho as mesmas configurações. Não me surpreende, pois esta é a configuração oficial para usar com TypeScript

Acho que o problema é que firebase serve não está ouvindo alterações no diretório "source" das funções e não executará os scripts de pré-implantação, definidos em firebase.json .

Seria ótimo se isso fosse adicionado. : D

Ahh e seria ótimo se eu pudesse definir outros scripts de pré-implantação para o servidor firebase, então não terei que executar, por exemplo, tslint em testes :)

@IchordeDionysos Não acho que seja apenas TypeScript. Tentei fazer a mesma coisa que meu exemplo em JavaScript e parecia fazer a mesma coisa. Acho que o problema é com o servidor olhando apenas para o ponto de entrada e não o resto do código. Esperançosamente, a equipe do firebase pode lançar alguma luz sobre o problema em breve.

@laurenzlong instalar manualmente o watchman parece fazer as coisas funcionarem (obrigado @tstirrat pela sugestão)

Obrigado pelo repro @safarmer detalhado, muito útil. Consegui rastrear a raiz do problema e preenchi https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/207. Siga esse problema.

Para outros que vêm aqui, instale o watchman do código-fonte ou Linuxbrew , não o pacote npm

@laurenzlong Posso reproduzir esse problema no Windows e, em particular, a alteração de index.ts não está sendo detectada. Estou tendo que executar o tsc manualmente. A alteração é então detectada e a função recarregada.
Devo abrir um exemplar separado?

notas rápidas: às vezes info: Worker for helloWorld closed due to file changes. é detectado no ts, mas a lib não é atualizada. outras vezes, não é detectado. a execução manual do tsc sempre recarrega a função.

@tstirrat instalar o watchman no Windows de acordo com as instruções não parece funcionar

Que erros você está enfrentando especificamente ao instalar o watchman?

Sem erros ao instalar o watchman. Mas servir as funções não é quente
recarregar. Tenho que parar de servir, construir e servir novamente após cada mudança.

Na quarta-feira, 21 de novembro de 2018 à 1:01, Kevin Jian [email protected] escreveu:

Que erros você está enfrentando especificamente ao instalar o watchman?

-
Você está recebendo isso porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/firebase/firebase-tools/issues/758#issuecomment-440460196 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AHgHbeA_iECsIMH3V9P7NQypsmudF_IQks5uxInggaJpZM4Tta12
.

Reabertura devido a vários relatórios de que ainda não está funcionando no Windows

Ainda não funciona no Ubuntu 18.04 com Node.js v10.15.0

Olá a todos, obrigado pelos relatórios detalhados. @afuggini , recebo 404 quando clico nesse link. As permissões estão definidas corretamente nesse repo para exibição pública? Há outro problema semelhante a este: https://github.com/firebase/firebase-tools/issues/1022. Ouvi dizer que esse problema está criando um ponto problemático para o desenvolvimento local com o Typescript.

Registrei um bug em nosso rastreador interno: 123266946. Não posso me comprometer quando poderemos resolver isso, mas sei que isso está sendo rastreado. Os RP são bem-vindos!

Eu também encontrei esse erro. Não consegui criar nenhuma solução alternativa, então tenho que reiniciar o servidor após cada alteração. Se você conhece uma solução alternativa confiável, entre em contato.

@ondratra, você pode fornecer sua versão CLI atual, plataforma de sistema operacional e nos informar se estiver trabalhando com algo diferente de npm (por exemplo, yarn )?

@bkendall estou no Debian (sid). Os arquivos de origem do typescript são observados e compilados por meio de tsc -w + funções são atendidas por meio de firebase --only functions serve . package.json contém o caminho correto para
arquivo de saída js {"main": "dist/src/index.js", ...} . Eu até tentei usar o pacote tsc-watch e explicitamente o arquivo de índice touch , mas sem sucesso.

$ firebase --version
6.3.1

Pessoal, vejam meu comentário anterior. O problema está relacionado a cloud-functions-emulator . Ele está usando o recurso de relógio fs , que tem um problema conhecido no Linux. Portanto, não espere uma solução diretamente de firebase-tools.

@ribizli thx, o link que você compartilhou certamente explica a natureza do problema. Mas eu ainda não encontrei nenhuma solução alternativa. Existe alguma possibilidade de assistir os arquivos por meio de um script personalizado e forçar o Firebase a recarregar?

@ondratra fork @google-cloud/functions-emulator , adicione node-watch como mencionei em meu comentário vinculado, npm link o pacote. Reinstale firebase-tools : ele tem @google-cloud/functions-emulator como dependência opcional, então sua versão vinculada será usada.

E finalmente: você pode fazer um PR para https://github.com/GoogleCloudPlatform/cloud-functions-emulator e esperar que eles aceitem e lançem em breve. (Eu poderia viver com minha solução alternativa, então não contribuí)

funções -> index.js depois de salvar este arquivo, como posso iniciar a execução automática de "firebase serve"

Solução alternativa em https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196 (obrigado @dirkjot):

Isso funcionou para mim. Aqui estão as instruções completas e uma correção para o pequeno erro de digitação de @ribizli :

  • Encontre seu diretório @google-cloud , provavelmente em seu node_modules (veja abaixo para Firebase)
  • cd functions-emulator
  • Adicionar node-watch: npm install --save node-watch
  • Edite o arquivo src/supervisor/worker.js
  • Por volta da linha 180, você encontrará fs.watch(localdir, { . Substitua por require('node-watch')(localdir, { .

Usando o Firebase com o typescript, tudo o que tenho a fazer é executar tsc -w em um terminal separado (a variante de relógio de npm run build ). Agora posso alterar meu código-fonte e o emulador notará as alterações.

Se você instalou firebase globalmente, poderá encontrar esses arquivos navegando até cd $(npm root -g)/firebase-tools/node_modules/@google-cloud .

Ei pessoal -

Este bug está relacionado à capacidade de recarregamento a quente do emulador legado do Cloud Functions. Em maio de 19, não usamos mais google-cloud/functions-emulator em firebase-tools então isso muda a natureza do bug (acredito que a nova natureza é que ele não existe).

Agradeço a todos que trabalharam duro e descobriram soluções alternativas e, finalmente, nosso novo emulador deve permitir que qualquer linguagem transpilada seja recarregada a quente, desde que você esteja executando seu observador (como tsc -w ) separadamente de firebase serve .

Com o novo back-end do emulador, resolvemos esse problema e agora todas as soluções alternativas neste tópico estão desatualizadas, então fecharei este tópico para evitar confusão.

Se você ainda está vendo algum comportamento não intencional, abra um novo bug.

Obrigado novamente!

Caso outros acabem aqui, aqui está realmente como configurá-lo em functions/package.json para que tsc -w executado separadamente de firebase serve :

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

Em outras palavras, execute tsc -w e canalize a saída para firebase serve . Não acho que o cachimbo realmente mande alguma coisa; Eu acho que quando a fonte muda, o tsc é executado novamente e firebase serve está observando o dir de saída de tsc ( lib ) então ele recarrega. Portanto, o tubo existe apenas para gerenciamento de processos.

A instalação simultânea funcionou para mim:

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

Para mim, em [email protected] recarregar a quente não está funcionando fora da caixa. Modifiquei build em functions/package.json para ser tsc -w como

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

Isso manterá o relógio ativo para as funções quando eu executar npm run build , a partir de another terminal , executei firebase emulators:start .

@ rami-alloush é o fluxo de trabalho que uso também. Os emuladores não reconstroem seu código, mas o recarregam a quente.

Outra versão

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

isto executa tsc em segundo plano e silenciosamente, então você não precisa de outro terminal.

Obrigado pela reprodução! Vou dar uma olhada na próxima semana.

É isso?

Enfrentando o mesmo problema com o texto digitado, o recarregamento a quente não funciona.

mesmo ... o recarregamento a quente não está funcionando, e é difícil fazer o emulador reconhecer as mudanças ...

@oluckyman resolveu o problema. muito agradável

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

[ATUALIZADA]

  • firebase-tools => 8.7.0

Minha solução:

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"
  },
...

Execute yarn serve

Demo

Aug-06-2020 14-05-38

Isso funciona perfeitamente bem para mim no momento na versão 8.8.1 firebase-tools usando typescript. Obrigado pelas dicas pessoal @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"
  },
Esta página foi útil?
0 / 5 - 0 avaliações