Firebase-tools: firebase serve --only functions bukan hot reload

Dibuat pada 1 Mei 2018  ·  43Komentar  ·  Sumber: firebase/firebase-tools

Informasi versi

firebase --version
3.18.4

Informasi Platform

Ubuntu 18.04 x64

Langkah-langkah untuk mereproduksi

  1. Proyek fungsi cloud Firebase dengan TypeScript menggunakan benang
  2. benang membangun --watch
  3. Lihat fungsi HTTPS di browser
  4. Perbarui respons fungsi
  5. Segarkan halaman di browser

Perilaku yang diharapkan

Browser menampilkan konten yang diperbarui

Perilaku sebenarnya

Halaman hanya diperbarui setelah memulai ulang perintah firebase serve. Saya telah mengkonfirmasi bahwa output di lib telah diperbarui.

> 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

Komentar yang paling membantu

Jika orang lain berakhir di sini, berikut sebenarnya cara mengaturnya di functions/package.json jadi tsc -w berjalan terpisah dari firebase serve :

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

Dengan kata lain, jalankan tsc -w dan pipa hasilnya menjadi firebase serve . Saya tidak berpikir pipa itu benar-benar mengirimkan apa pun; Saya pikir ketika sumber berubah, tsc dijalankan kembali, dan firebase serve sedang menonton dir keluaran tsc ( lib ) sehingga dimuat ulang. Jadi pipanya benar-benar hanya untuk manajemen proses.

Semua 43 komentar

Saya baru saja mencoba ini pada mesin yang berbeda (Debian Stretch) dengan proyek baru (firebase init) dan hal yang sama terjadi dengan fungsi hello world. Saya memperhatikan bahwa jika saya mengubah sumber sebelum mengirim permintaan ke fungsi, tetapi setelah fungsi siap untuk melayani, saya bisa membuatnya hot reload sekali dan kemudian akan berhenti bekerja lagi.

Saya telah mencoba membuat proyek baru (firebase init) di Mac dan mesin Linux, Ini berfungsi di Mac dan bukan di Linux.

Saya melakukan beberapa percobaan dan saya bisa mendapatkan contoh hello world dalam JavaScript untuk memuat ulang panas tetapi bukan contoh TypeScript. Tampaknya firebase serve hanya memperhatikan index.js dalam direktori yang dikonfigurasi di `firebase.json.

Untuk mendapatkan proyek saya memuat ulang untuk TypeScript (dan saya berasumsi tata letak JavaScript yang lebih kompleks yang memiliki lebih dari index.js ) saya harus menggunakan Webpack untuk menghasilkan satu file functions/lib/index.js dan mengkonfigurasi Firebase untuk mencari file saya. kode fungsi di functions/list . Ini kemudian membuat hot reload berfungsi untuk firebase functions:shell dan firebase serve .

Ketika saya menggunakan tsc (sesuai dengan template firebase init ) kode hanya akan dimuat ulang jika saya memodifikasi file index.js dihasilkan. Alur kerja saya saat ini adalah menjalankan webpack --watch di satu terminal dengan firebase serve --only functions di terminal lain. Saya sekarang mendapatkan isi ulang panas. Akan lebih baik jika saya bisa kembali ke default dari firebase init .

Firebase.json telah diperbarui

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

@safarmer Seperti apa functions / package.json Anda? Apakah itu memiliki bidang main ?

Saya sudah mulai menggunakan default yang dihasilkan oleh 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
}

Cara paling sederhana yang saya miliki untuk mereplikasi masalah:

  1. firebase init && cd functions && yarn
  2. Hapus tanda komentar pada fungsi helloWorld
  3. mkdir src/handlers && mv src/index.ts src/handlers/helloworld.ts
  4. echo "export * from './handlers/helloworld';" > src/index.ts
  5. Di terminal 1: yarn build --watch
  6. Di terminal 2: firebase serve --only functions

Mengunjungi URL di browser, Anda melihat pesan hello world. Jika Anda mengubah string yang dikembalikan dari handler di handler.ts, satu-satunya cara agar hasil berubah adalah dengan memulai ulang perintah firebase serve .

Menambahkan "source": "functions/lib" ke firebase.json membuat kode hot reload jika Anda mengubah apa pun di functions/lib tetapi direktori lever yang lebih rendah tidak memicu muat ulang. Dimungkinkan untuk menjalankan touch lib/injex.js untuk memicu pemuatan ulang. Misalnya, mengubah penangan di src/index.ts memicu muat ulang, tetapi mengubah src/handlers/helloworld.ts tidak.

@laurenzlong , yang terbaik yang saya miliki sejauh ini adalah (diambil dari hasil default firebase init) di bawah. Dengan ini, saya masih perlu menjalankan touch lib/index.js . Masalah lain dengan ini adalah bahwa firebase deploy tidak lagi berfungsi.

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 Saya memiliki contoh sederhana yang dapat Anda
https://github.com/safarmer/firebase-functions

Terima kasih atas tegurannya! Saya akan melihatnya minggu depan.

Masalah yang sama di sini :)
Bagi saya, sepertinya firebase serve tidak mendukung Typecript untuk saat ini ...

Saya telah membandingkan file yang Anda minta dengan file yang dikirim @safarmer dan saya memiliki konfigurasi yang sama. Tidak mengejutkan saya karena ini adalah konfigurasi resmi untuk digunakan dengan TypeScript

Saya pikir masalahnya adalah bahwa firebase serve tidak mendengarkan perubahan dalam fungsi direktori "source" dan tidak akan menjalankan skrip pra-penerapan, yang ditentukan dalam firebase.json .

Akan lebih bagus jika ini akan ditambahkan. : D

Ahh dan akan sangat bagus jika saya dapat menentukan skrip pra-penerapan lain untuk firebase serve, jadi saya tidak perlu menjalankan misalnya tslint dalam pengujian :)

@IchordeDionos Saya tidak berpikir itu hanya TypeScript. Saya mencoba melakukan hal yang sama seperti contoh saya di JavaScript dan sepertinya melakukan hal yang sama. Saya pikir masalahnya adalah dengan server hanya melihat titik masuk dan bukan sisa kode. Semoga tim firebase dapat segera menjelaskan masalah ini.

@laurenzlong menginstal penjaga secara manual tampaknya membuat semuanya bekerja (terima kasih @tstirrat untuk sarannya)

Terima kasih atas repro mendetail @safarmer , sangat membantu. Saya dapat melacak akar masalah dan mengajukan https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/207. Harap ikuti masalah itu.

Untuk orang lain yang datang ke sini, instal watchman dari source atau Linuxbrew , bukan paket npm

@ laurenzlong Saya dapat mereproduksi masalah ini di Windows dan khususnya perubahan index.ts tidak terdeteksi. Saya harus menjalankan tsc secara manual. Perubahan tersebut kemudian terdeteksi dan fungsinya dimuat ulang.
Haruskah saya membuka terbitan terpisah?

catatan singkat: terkadang info: Worker for helloWorld closed due to file changes. terdeteksi di ts tetapi lib tidak dimuat ulang. di lain waktu itu tidak terdeteksi sama sekali. menjalankan tsc secara manual selalu memuat ulang fungsi.

@tstirrat menginstal penjaga di windows sesuai instruksi sepertinya tidak berfungsi

Kesalahan apa yang secara khusus Anda hadapi saat menginstal watchman?

Tidak ada kesalahan saat memasang penjaga. Tapi fungsi penyajian tidak panas
memuat ulang. Saya harus berhenti melayani, membangun, dan melayani lagi setelah setiap perubahan.

Pada Rabu, 21 Nov 2018 pukul 01:01 Kevin Jian [email protected] menulis:

Kesalahan apa yang secara khusus Anda hadapi saat menginstal watchman?

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/firebase/firebase-tools/issues/758#issuecomment-440460196 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/AHgHbeA_iECsIMH3V9P7NQypsmudF_IQks5uxInggaJpZM4Tta12
.

Pembukaan kembali karena beberapa laporan ini masih tidak berfungsi di Windows

Masih tidak berfungsi di Ubuntu 18.04 dengan Node.js v10.15.0

Halo semuanya, terima kasih atas laporan terperinci. @afuggini Saya mendapatkan 404 ketika saya mengklik tautan itu, apakah izin diatur dengan benar pada repo itu untuk dilihat publik? Ada masalah lain yang mirip dengan ini: https://github.com/firebase/firebase-tools/issues/1022. Saya mendengar bahwa masalah ini menimbulkan masalah bagi pengembangan lokal dengan Typecript.

Saya telah melaporkan bug di pelacak internal kami: 123266946. Saya tidak dapat berkomitmen jika kami dapat menyiasatinya, tetapi ketahuilah bahwa ini sedang dilacak. PR dipersilahkan!

Saya juga mengalami kesalahan ini. Saya tidak dapat membuat solusi apa pun jadi saya harus memulai ulang server setelah setiap perubahan. Jika Anda mengetahui solusi yang dapat diandalkan, beri tahu saya.

@ondratra dapatkah Anda memberikan versi CLI Anda saat ini, platform OS, dan memberi tahu kami jika Anda bekerja dengan apa pun selain npm (mis. yarn )?

@bkendall Saya di Debian (sid). File sumber skrip ditonton dan dikompilasi melalui tsc -w + fungsi disajikan melalui firebase --only functions serve . package.json berisi path yang benar ke
file keluaran js {"main": "dist/src/index.js", ...} . Saya bahkan mencoba menggunakan paket tsc-watch dan secara eksplisit touch file indeks, tetapi tidak berhasil.

$ firebase --version
6.3.1

Teman-teman, periksa komentar saya sebelumnya. Masalahnya terkait dengan cloud-functions-emulator . Ini menggunakan fitur jam tangan fs , yang memiliki masalah umum di linux. Jadi jangan mengharapkan solusi langsung dari firebase-tools.

@ribizli thx, tautan yang Anda bagikan pasti menjelaskan sifat masalahnya. Tetapi saya masih belum menemukan solusi apa pun. Apakah ada kemungkinan untuk menonton file melalui skrip khusus dan memaksa firebase untuk memuat ulang?

@ondratra garpu @google-cloud/functions-emulator , tambahkan node-watch seperti yang saya sebutkan di komentar tertaut saya, npm link paket. Instal ulang firebase-tools : memiliki @google-cloud/functions-emulator sebagai ketergantungan opsional, sehingga versi tertaut Anda akan digunakan.

Dan terakhir: Anda dapat membuat PR ke https://github.com/GoogleCloudPlatform/cloud-functions-emulator dan berharap mereka akan menerima dan merilisnya segera. (Saya bisa hidup dengan solusi saya, jadi saya belum berkontribusi)

functions -> index.js setelah menyimpan file ini, bagaimana saya bisa memulai "firebase serve" autorun

Solusi dari https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196 (terima kasih @dirkjot):

Ini berhasil untuk saya, berikut adalah instruksi lengkap dan perbaikan untuk kesalahan ketik kecil @ribizli :

  • Temukan direktori @google-cloud , mungkin di node_modules (lihat di bawah untuk Firebase)
  • cd functions-emulator
  • Tambahkan node-watch: npm install --save node-watch
  • Edit file src/supervisor/worker.js
  • Sekitar baris 180, Anda akan menemukan fs.watch(localdir, { . Gantikan ini dengan require('node-watch')(localdir, { .

Menggunakan Firebase dengan skrip ketikan, yang harus saya lakukan adalah menjalankan tsc -w di terminal terpisah (varian jam tangan npm run build ). Sekarang saya dapat mengubah kode sumber saya dan emulator akan melihat perubahannya.

Jika Anda menginstal firebase secara global, Anda dapat menemukan file-file ini dengan menavigasi ke cd $(npm root -g)/firebase-tools/node_modules/@google-cloud .

Hai semuanya -

Bug ini terkait dengan kemampuan hot-reload emulator Cloud Functions yang lama. Mulai Mei '19 kami tidak lagi menggunakan google-cloud/functions-emulator di firebase-tools jadi ini mengubah sifat bug (saya yakin sifat baru itu tidak ada).

Saya menghargai semua orang yang bekerja keras dan mencari solusi dan akhirnya emulator baru kami harus memungkinkan bahasa transpiled untuk memuat ulang secara panas selama Anda menjalankan pengamat Anda (seperti tsc -w ) secara terpisah dari firebase serve .

Dengan backend emulator baru, kami telah menyelesaikan masalah ini dan sekarang semua solusi di utas ini sudah usang, jadi saya akan menutup utas ini untuk menghindari kebingungan.

Jika Anda masih melihat perilaku yang tidak diinginkan, buka bug baru.

Terima kasih lagi!

Jika orang lain berakhir di sini, berikut sebenarnya cara mengaturnya di functions/package.json jadi tsc -w berjalan terpisah dari firebase serve :

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

Dengan kata lain, jalankan tsc -w dan pipa hasilnya menjadi firebase serve . Saya tidak berpikir pipa itu benar-benar mengirimkan apa pun; Saya pikir ketika sumber berubah, tsc dijalankan kembali, dan firebase serve sedang menonton dir keluaran tsc ( lib ) sehingga dimuat ulang. Jadi pipanya benar-benar hanya untuk manajemen proses.

Menginstal secara bersamaan berhasil untuk saya:

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

Bagi saya dengan [email protected] hot reload tidak bekerja di luar kotak. Saya mengubah build di functions/package.json menjadi tsc -w sebagai

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

Ini akan membuat jam tangan tetap aktif untuk fungsi-fungsi saat saya menjalankan npm run build , lalu dari another terminal saya menjalankan firebase emulators:start .

@ rami-alloush itulah alur kerja yang saya gunakan juga. Emulator tidak membuat ulang kode Anda tetapi mereka memuat ulang kode yang dibangun.

versi lain

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

ini menjalankan tsc di latar belakang dan tenang, jadi Anda tidak memerlukan terminal lain.

Terima kasih atas tegurannya! Saya akan melihatnya minggu depan.

Apakah itu?

Menghadapi masalah yang sama dengan skrip ketikan, hot-reload tidak berfungsi.

sama ... hot reload tidak berfungsi, dan sulit membuat emulator mengenali perubahan sama sekali ...

@olucky memecahkan masalah. sangat bagus

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

[DIPERBARUI]

  • firebase-tools => 8.7.0

Solusi saya:

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

Jalankan yarn serve

Demo

Aug-06-2020 14-05-38

Ini berfungsi dengan baik untuk saya saat ini di firebase-tools versi 8.8.1 menggunakan skrip. Terima kasih untuk tipsnya guys @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"
  },
Apakah halaman ini membantu?
0 / 5 - 0 peringkat