Firebase-tools: خدمة Firebase - وظائف فقط وليس إعادة تحميل ساخنة

تم إنشاؤها على ١ مايو ٢٠١٨  ·  43تعليقات  ·  مصدر: firebase/firebase-tools

معلومات الإصدار

Firebase - الإصدار
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 كيف تبدو وظائفك / package.json؟ هل يحتوي على حقل 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 أفضل ما لدي حتى الآن هو (مأخوذ من النتيجة الافتراضية لـ firebase init) أدناه. مع هذا ، ما زلت بحاجة إلى تشغيل touch lib/index.js . مشكلة Antoher مع هذا هو أن 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 لا يدعم الكتابة المطبوعة في الوقت الحالي ...

لقد قارنت الملفات التي طلبتها مع تلك التي أرسلتها safarmer ولدي نفس التكوينات. لا يفاجئني لأن هذا هو التكوين الرسمي للاستخدام مع TypeScript

أعتقد أن المشكلة تكمن في أن firebase serve لا يستمع للتغييرات في دليل الوظائف "المصدر" ولن يقوم بتشغيل البرامج النصية قبل النشر ، المحددة في firebase.json .

سيكون رائعا إذا تم إضافة هذا. :د

آه ، وسيكون رائعًا إذا كان بإمكاني تحديد البرامج النصية الأخرى للنشر المسبق لخدمة Firebase ، لذلك لن أضطر إلى التشغيل على سبيل المثال tslint في الاختبار :)

IchordeDionysos لا أعتقد أنه مجرد TypeScript. حاولت أن أفعل نفس الشيء مثل المثال الخاص بي في JavaScript وبدا أنه يفعل الشيء نفسه. أعتقد أن المشكلة تتعلق بالخادم فقط بالنظر إلى نقطة الدخول وليس إلى بقية الكود. نأمل أن يتمكن فريق Firebase من إلقاء بعض الضوء على المشكلة قريبًا.

يبدو أن تثبيت @ laurenzlong يدويًا يجعل الأشياء تعمل (شكرًا tstirrat على الاقتراح)

شكرا على Repro المفصل 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 صباحًا كتب Kevin Jian [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. لا يمكنني الالتزام عندما يمكننا الالتفاف حول هذا الأمر ، لكنني أعلم أنه يتم تتبع ذلك. العلاقات العامة هي موضع ترحيب كبير!

أنا أيضا واجهت هذا الخطأ. لم أتمكن من إنشاء أي حل بديل لذلك يجب علي إعادة تشغيل الخادم بعد كل تغيير. إذا كنت تعرف حلاً موثوقًا به ، فيرجى إبلاغي بذلك.

ondratra ، هل يمكنك تقديم إصدار CLI الحالي ونظام التشغيل الأساسي وإعلامنا إذا كنت تعمل مع أي شيء آخر غير npm (على سبيل المثال yarn

bkendall أنا على دبيان (sid). تتم مشاهدة الملفات المصدر للطباعة وتصنيفها عبر tsc -w + يتم تقديم الوظائف عبر firebase --only functions serve . package.json على المسار الصحيح لـ
js ملف الإخراج {"main": "dist/src/index.js", ...} . حتى أنني حاولت استخدام حزمة tsc-watch وصراحة ملف فهرس touch ، لكن دون جدوى.

$ 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 كتبعية اختيارية ، لذلك سيتم استخدام نسختك المرتبطة.

وأخيرًا: يمكنك إنشاء علاقات عامة على https://github.com/GoogleCloudPlatform/cloud-functions-emulator وآمل أن يقبلوا ويصدروا قريبًا. (يمكنني التعايش مع الحل الخاص بي ، لذلك لم أساهم)

وظائف -> index.js بعد حفظ هذا الملف ، كيف يمكنني بدء التشغيل التلقائي لـ "firebase serve"

الحل البديل من https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/196 (شكرًاdirkjot):

لقد نجح هذا الأمر بالنسبة لي ، إليك الإرشادات الكاملة وإصلاح الخطأ المطبعي الصغير

  • ابحث عن @google-cloud ، ربما في node_modules (انظر أدناه للحصول على Firebase)
  • cd functions-emulator
  • إضافة node-watch: 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 .

مرحبا يا اصدقاء -

يتعلق هذا الخطأ بقدرة محاكي وظائف السحابة القديمة على إعادة التحميل السريع. اعتبارًا من مايو 2019 لم نعد نستخدم 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 8.8.1 باستخدام الكتابة المطبوعة. الشكر للنصائح الرجالmoifortgaryosafarmerabeisgoat: 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 التقييمات