প্রতিক্রিয়া-নেটিভ পরিবেশের পরিবর্তনশীল সেট?


152

আমি ক্রস-প্ল্যাটফর্ম অ্যাপ্লিকেশন তৈরি করতে প্রতিক্রিয়া-স্থানীয় ব্যবহার করছি, তবে কীভাবে পরিবেশের পরিবর্তনশীল সেট করতে হবে তা আমি জানি না যাতে আমার বিভিন্ন পরিবেশের জন্য বিভিন্ন ধ্রুবক থাকতে পারে।

উদাহরণ:

development: 
  BASE_URL: '',
  API_KEY: '',
staging: 
  BASE_URL: '',
  API_KEY: '',
production:
  BASE_URL: '',
  API_KEY: '',

আপনি এটি চেষ্টা করতে পারেনimport {Platform} from 'react-native'; console.log(Platform);
প্রবীণ প্রসাদ

উত্তর:


138

আপনার অ্যাপের ধ্রুবকগুলিকে কঠোর কোডিং করা এবং পরিবেশের উপর স্যুইচ করার পরিবর্তে (আমি কীভাবে এটি করব তা একটি মুহূর্তের মধ্যে ব্যাখ্যা করব), আমি আপনার বিল্ড প্রক্রিয়াটি আপনার এবং আপনার সংজ্ঞা প্রদানের বারোটি ফ্যাক্টর পরামর্শ ব্যবহার করার পরামর্শ দিচ্ছিBASE_URLAPI_KEY

আপনার পরিবেশকে কীভাবে প্রকাশ করা যায় তার জবাব দেওয়ার জন্য react-native, আমি বাবেলের ব্যাবেল -প্লাগ-ইন-ট্রান্সফর্ম-ইনলাইন-এনভায়রনমেন্ট-ভেরিয়েবলগুলি ব্যবহার করার পরামর্শ দিই ।

এটি কাজ করার জন্য আপনাকে প্লাগইনটি ডাউনলোড করতে হবে এবং তারপরে আপনাকে একটি সেটআপ করতে হবে .babelrcএবং এটির মতো দেখতে হবে:

{
  "presets": ["react-native"],
  "plugins": [
    "transform-inline-environment-variables"
  ]
}

এবং তাই আপনি যদি চালিত API_KEY=my-app-id react-native bundle(বা শুরু, রান-আইওএস, বা রান-অ্যান্ড্রয়েড) দ্বারা আপনার প্রতিক্রিয়াভিত্তিক কোডটি পরিবহন করেন তবে আপনাকে যা করতে হবে তা হ'ল আপনার কোডটি দেখতে এ জাতীয় চেহারা:

const apiKey = process.env['API_KEY'];

এবং তারপরে বাবেল এটি দিয়ে প্রতিস্থাপন করবে:

const apiKey = 'my-app-id';

আশাকরি এটা সাহায্য করবে!


7
দুর্দান্ত সমাধানের মতো শোনাচ্ছে তবে আরএন @ ০.৩7.০ এ আমার জন্য কাজ করে না। একমাত্র সম্পত্তি process.envহল NODE_ENV
অ্যাডাম ফারিনা 21

2
জ্যাক ঝেংয়ের নীচের উত্তরটি দেখুন ... আপনি পরিবর্তে process.env.API_KEYব্যবহার করতে পারবেন না ... process.env['API_KEY']পরিবর্তে ব্যবহার করুন
স্টিভেন ইয়াপ

6
আমি প্রসেসটি.এনভ ['API_KEY'] অপরিজ্ঞাত হিসাবে পেয়ে যাচ্ছি। কেউ আমাকে সেট আপ করতে সহায়তা করতে পারে
ব্যবহারকারীর 106868

2
আমার একই সমস্যা ছিল: অপরিবর্তিত
গুটো মারারার মার্জাগাও

7
V0.56 এ আমার জন্য কাজ করে। react-native start --reset-cacheপ্রতিবার পরিবেশের ভেরিয়েবলগুলি পরিবর্তন করার সাথে সাথে আপনাকে বান্ডলারের ক্যাশে সাফ করতে হবে।
soheilpro

55

সবচেয়ে সহজ ( সেরা বা আদর্শ নয় ) সমাধানটি আমি খুঁজে পেলাম হ'ল রিএ্যাক্ট-নেটিভ-ডটেনভ ব্যবহার করা । আপনি .babelrcপ্রকল্পের মূলটিতে আপনার ফাইলটিতে কেবল "প্রতিক্রিয়া-নেটিভ-ডোটেনভ" প্রিসেট যুক্ত করুন:

{
  "presets": ["react-native", "react-native-dotenv"]
}

একটি .envফাইল তৈরি করুন এবং বৈশিষ্ট্য যুক্ত করুন:

echo "SOMETHING=anything" > .env

তারপরে আপনার প্রকল্পে (জেএস):

import { SOMETHING } from 'react-native-dotenv'
console.log(SOMETHING) // "anything"

1
আমি .env ভিত্তিক সমাধানের জন্য আশা করছিলাম। ধন্যবাদ!
আনশুল কোকা

3
@Slavo Vojacek আমি কিভাবে উদাহরণস্বরুপ কোনো কনফিগার করতে এটি ব্যবহার না base_urlউভয়ের জন্য stagingএবং production?
কমপ্যাক LE2202x

@ CompaqLE2202x আমি নিশ্চিত যে আমি বুঝতে পারছি না? আপনি কি বিভিন্ন .envফাইল (পরিবেশ প্রতি) ব্যবহার করার বিষয়ে জিজ্ঞাসা করছেন , বা বিভিন্ন ফাইলগুলিতে আপনার কিছু মানকে পুনরায় ব্যবহার করার বিষয়ে জিজ্ঞাসা করছেন .env, সুতরাং আপনি সেগুলি জুড়ে নকল করবেন না, বলুন, মঞ্চায়ন এবং উত্পাদন?
স্লাভো ভোজাসেক

5
@ স্লাভোভেসাক আমি .envপরিবেশের জন্য বিভিন্ন ফাইল সম্পর্কে জিজ্ঞাসা করছি আসুন stagingএবং বলি production
কমপ্যাক LE2202x

@ স্লাভোভেসেক আপনি কি সিআই পর্যায়ে বা স্থাপনার সময়ে মানগুলি ওভাররাইট করতে পারবেন না?
মিগামসজাগার

37

আমার মতে সবচেয়ে ভাল বিকল্পটি হল রিএ্যাক্ট-নেটিভ-কনফিগার ব্যবহার করা । এটি 12 ফ্যাক্টর সমর্থন করে ।

আমি এই প্যাকেজটি অত্যন্ত দরকারী বলে মনে করি। আপনি একাধিক পরিবেশ নির্ধারণ করতে পারেন, যেমন উন্নয়ন, মঞ্চায়ন, উত্পাদন।

অ্যান্ড্রয়েডের ক্ষেত্রে, জাভা ক্লাস, গ্রেডেল, অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ইত্যাদিতেও ভেরিয়েবলগুলি উপলব্ধ।

আপনি যেমন ফাইল তৈরি করুন

  • .env.development
  • .env.staging
  • .env.production

আপনি এই ফাইলগুলি কী, মানগুলির মতো পূরণ করুন

API_URL=https://myapi.com
GOOGLE_MAPS_API_KEY=abcdefgh

এবং তারপরে এটি ব্যবহার করুন:

import Config from 'react-native-config'

Config.API_URL  // 'https://myapi.com'
Config.GOOGLE_MAPS_API_KEY  // 'abcdefgh'

আপনি যদি বিভিন্ন পরিবেশ ব্যবহার করতে চান তবে আপনি মূলত ENVFILE ভেরিয়েবলটি সেট করুন:

ENVFILE=.env.staging react-native run-android

বা উত্পাদনের জন্য অ্যাপ্লিকেশন একত্র করার জন্য (আমার ক্ষেত্রে অ্যান্ড্রয়েড):

cd android && ENVFILE=.env.production ./gradlew assembleRelease

9
এটি লক্ষ করার মতো হতে পারে যে README এ এটি বলেছে যে এই মডিউলটি প্যাকেজিংয়ের জন্য গোপনীয় বিষয়গুলিকে অবহেলা বা এনক্রিপ্ট করে না, সুতরাং .env- তে সংবেদনশীল কীগুলি সংরক্ষণ করবেন না। রিভার্সিং ইঞ্জিনিয়ারিং মোবাইল অ্যাপ সিক্রেটস থেকে ব্যবহারকারীদের আটকাতে মূলত এটি অসম্ভব, সুতরাং আপনার অ্যাপটি (এবং এপিআই) এটি মাথায় রেখে ডিজাইন করুন
মার্কার

জিনিস এটা করবে টুইটার মত কিছু অবকাঠামো যা তারা আপনার .env মধ্যে com.twitter.sdk.android.CONSUMER_KEY যেমন চাবি সেট আছে প্রয়োজন সঙ্গে কাজ করে না
thibaut নূহ

যদি আপনি চাবিটি ম্যানিফেস্টের ভিতরে রাখার অর্থ করেন তবে এক্সটেনশন এটি সমর্থন করে। এটি কেবল এই উত্তরে বর্ণিত নয়। আপনি এক্সএমএল, জাভা এবং জেএস ফাইলগুলিতে ভেরিয়েবলগুলি ব্যবহার করতে পারেন।
sfratini

4
প্রতিক্রিয়া-নেটিভ-কনফিগারেশন আরএন 0.56 এর সাথে কাজ করে না, এটির অমীমাংসিত সমস্যা রয়েছে এবং এটি 6 মাসেরও বেশি সময় ধরে অবিস্মরণীয়। ইআরসি ডাইনিটি আরএন-তে এর ব্যবহারকে মেরে ফেলেছে এটি হল github.com/luggit/react-native-config/issues/267 , এটি github.com/luggit/react-native-config/issues/285
রয়েছে

24

দেশীয় প্রতিক্রিয়া বিশ্বব্যাপী ভেরিয়েবলের ধারণা নেই have উপাদানগুলির মডুলারালিটি এবং পুনঃব্যবহারযোগ্যতা প্রচারের জন্য এটি কঠোরভাবে মডুলার স্কোপ প্রয়োগ করে।

যদিও কখনও কখনও তাদের পরিবেশ সম্পর্কে সচেতন হওয়ার জন্য আপনার উপাদানগুলির প্রয়োজন। এই ক্ষেত্রে এমন একটি Environmentমডিউল নির্ধারণ করা খুব সহজ যা উপাদানগুলি পরিবেশের ভেরিয়েবলগুলি পেতে কল করতে পারে, উদাহরণস্বরূপ:

environment.js

var _Environments = {
    production:  {BASE_URL: '', API_KEY: ''},
    staging:     {BASE_URL: '', API_KEY: ''},
    development: {BASE_URL: '', API_KEY: ''},
}

function getEnvironment() {
    // Insert logic here to get the current platform (e.g. staging, production, etc)
    var platform = getPlatform()

    // ...now return the correct environment
    return _Environments[platform]
}

var Environment = getEnvironment()
module.exports = Environment

আমার-component.js

var Environment = require('./environment.js')

...somewhere in your code...
var url = Environment.BASE_URL

এটি একটি সিঙ্গলটন পরিবেশ তৈরি করে যা আপনার অ্যাপ্লিকেশনটির স্কোপের ভিতরে যে কোনও জায়গা থেকে অ্যাক্সেস করা যায়। আপনাকে require(...)পরিবেশের ভেরিয়েবলগুলি ব্যবহার করে এমন কোনও উপাদান থেকে স্পষ্টতই মডিউলটি করতে হবে, তবে এটি একটি ভাল জিনিস।


19
আমার সমস্যা হল কিভাবে getPlatform()। আমি এটির মতো একটি ফাইল তৈরি করেছি তবে এখানে প্রতিক্রিয়া নেটিভ
দামন ইউয়ান

@ দামন ইউয়ান আপনি কীভাবে আপনার প্যাকেজগুলি সেট আপ করছেন তার উপর সম্পূর্ণ নির্ভর করে। কী stagingবা productionএমনকি অর্থ তাও আমার কোনও ধারণা নেই কারণ এটি আপনার পরিবেশের উপর নির্ভর করে। উদাহরণস্বরূপ, যদি আপনি Android বনাম iOS এর জন্য বিভিন্ন স্বাদে চান তারপর আপনি পরিবেশ এটা আমদানির আপনার দ্বারা আরম্ভ করতে পারেন index.ios.jsএবং index.android.jsফাইল ও সেখানে প্ল্যাটফর্ম সেটিং যেমন Environment.initialize('android')
টহস্টার

@ ড্যামন ইউয়ান যা আমি আদৌ সহায়তা দিয়েছি তা করে বা আপনার আরও কিছু স্পষ্টতা দরকার?
চাঁপিংপা

কোডটিতে আপনার নিয়ন্ত্রণ থাকলে এটি খুব সুন্দর। আমি একটি তৃতীয় অংশের মডিউল চালাচ্ছি যা প্রক্রিয়া.এনভের উপর নির্ভর করে, তাই ...
এপাপ করুন

2
যদি আপনি কোনও env.jsফাইল তৈরি করেন তবে এটি চেক-ইনগুলি থেকে সংগ্রহস্থলটিতে উপেক্ষা করা এবং খালি স্ট্রিং মান সহ ব্যবহৃত কীগুলি অনুলিপি করে অন্য কোনও env.js.exampleফাইলে অনুলিপি করা উচিত যাতে অন্যরা আপনার অ্যাপটি আরও সহজে তৈরি করতে পারে। যদি আপনি দুর্ঘটনাক্রমে প্রকল্পের গোপনীয়তাগুলি পরীক্ষা করে থাকেন তবে কেবল উত্স থেকে নয় ইতিহাসের ইতিহাস মুছে ফেলার জন্য পুনর্লিখনের ইতিহাসটি বিবেচনা করুন।
জোশ হাবদাস

17

আমি এই __DEV__পলফিলটি ব্যবহার করেছি যা এই সমস্যাটি সমাধানের জন্য প্রতিক্রিয়া-নেটিভ হিসাবে নির্মিত। trueআপনি উত্পাদনের জন্য দেশীয় প্রতিক্রিয়া তৈরি না করায় এটি স্বয়ংক্রিয়ভাবে সেট হয়ে গেছে ।

উদাহরণ:

//vars.js

let url, publicKey;
if (__DEV__) {
  url = ...
  publicKey = ...
} else {
  url = ...
  publicKey = ...
}

export {url, publicKey}

তারপরে ঠিক import {url} from '../vars'এবং আপনি সর্বদা সঠিকটি পাবেন। দুর্ভাগ্যক্রমে, আপনি যদি দুটিরও বেশি পরিবেশ চান তবে এটি কাজ করবে না তবে এটি সহজ এবং আপনার প্রকল্পে আরও নির্ভরতা যুক্ত করার সাথে জড়িত না।


আপনি 'foce' একটি উপায় জানি না DEV এমনকি যখন Xcode একটি রিলিজ বিল্ড তৈরি 'সত্য' কিভাবে?
রিয়েলটিবো

1
নাঃ। আমি কেবল প্রোড ভার্সগুলি সম্পর্কে মন্তব্য করি এবং তারপরে দেব ভেরিয়েবলগুলি সহ একটি রিলিজ বিল্ড করতে চাইলে প্রোটি বিভাগে ডেভ ভার্স অনুলিপি করি।
লগিস্টার

1
আমি এটি সবচেয়ে মার্জিত সমাধানটি পেয়েছি
ড্যানি এস 90 '

5

পরিবেশের ভেরিয়েবলগুলি সেট করতে ব্যবহৃত নির্দিষ্ট পদ্ধতিটি সিআই পরিষেবা, বিল্ড অ্যাপ্রোচ, প্ল্যাটফর্ম এবং আপনি যে সরঞ্জামগুলি ব্যবহার করছেন তার দ্বারা পৃথক হবে।

আপনি যদি অ্যাপ্লিকেশন তৈরি করতে এবং পরিবেশের ভেরিয়েবলগুলি পরিচালনা করতে সিআইয়ের জন্য বাডি বিল্ড ব্যবহার করেন এবং আপনার জেএস থেকে কনফিগার করতে অ্যাক্সেস প্রয়োজন, env.js.exampleসোর্স নিয়ন্ত্রণে চেক-ইন করার জন্য কীগুলি (খালি স্ট্রিং মান সহ) তৈরি করতে এবং বাডি বিল্ড ব্যবহার করার জন্য পদক্ষেপে env.jsবিল্ড টাইম সময়ে post-cloneফাইল, বিল্ড লগগুলি থেকে ফাইল সামগ্রীগুলি গোপন করা, যেমন:

#!/usr/bin/env bash

ENVJS_FILE="$BUDDYBUILD_WORKSPACE/env.js"

# Echo what's happening to the build logs
echo Creating environment config file

# Create `env.js` file in project root
touch $ENVJS_FILE

# Write environment config to file, hiding from build logs
tee $ENVJS_FILE > /dev/null <<EOF
module.exports = {
  AUTH0_CLIENT_ID: '$AUTH0_CLIENT_ID',
  AUTH0_DOMAIN: '$AUTH0_DOMAIN'
}
EOF

টিপ: যাতে কনফিগার করতে যোগ env.jsকরতে ভুলবেন না .gitignoreএবং গোপনীয়তা বিকাশের সময় দুর্ঘটনাক্রমে উত্স নিয়ন্ত্রণে পরীক্ষা করা হয় না।

এর পরে আপনি পরিচালনা করতে পারেন কিভাবে ফাইল লিখিত পরার ব্যবহার Buddybuild ভেরিয়েবল মত BUDDYBUILD_VARIANTS, উদাহরণস্বরূপ, কিভাবে আপনার কনফিগ বিল্ড সময়ে উত্পাদিত হয় আরো ভালো নিয়ন্ত্রণের লাভ।


সামগ্রিকভাবে আমি ধারণাটি পছন্দ করি তবে env.js.exampleঅংশটি কীভাবে কাজ করে? আসুন বলি যে আমি আমার স্থানীয় পরিবেশে অ্যাপটি চালু করতে চাই launch যদি আমার env.jsফাইল gitignore এবং env.js.exampleএকটি রূপরেখা হিসেবে ব্যবহার করা হয়, env.js.exampleএকটি বৈধ জাতীয় এক্সটেনশন নয় তাই আমি শুধু একটু এই অংশ দ্বারা কি বোঝানো উপর বিভ্রান্ত
volk

@ ভলক env.js.exampleফাইলটি কোডবেসে একটি রেফারেন্স ডকুমেন্ট হিসাবে বসে, অ্যাপটি কী কনফিগার কীগুলি গ্রাস করতে চায় তা সত্যতার একটি প্রচলিত উত্স। এটি উভয়ই অ্যাপটি চালানোর জন্য প্রয়োজনীয় কীগুলি বর্ণনা করে পাশাপাশি ফাইলের নামটি একবার অনুলিপি করা হয়েছে এবং পুনরায় নামকরণ করা হয়েছে। ডটেনভ রত্ন ব্যবহার করে রুবি অ্যাপগুলিতে প্যাটার্নটি সাধারণ ।
জোশ হাবদাস

3

আমি মনে করি নীচের লাইব্রেরির মতো কিছু আপনাকে ধাঁধাটির কিছুটা হারিয়ে যেতে সহায়তা করতে পারে, গেটপ্ল্যাটফর্ম () ফাংশন।

https://github.com/joeferraro/react-native-env

const EnvironmentManager = require('react-native-env');

// read an environment variable from React Native
EnvironmentManager.get('SOME_VARIABLE')
  .then(val => {
    console.log('value of SOME_VARIABLE is: ', val);

  })
  .catch(err => {
    console.error('womp womp: ', err.message);
  });

আমি কেবল এটিই দেখছি যে এটি অ্যাসিঙ্ক কোড। GetSync সমর্থন করার জন্য একটি টান অনুরোধ রয়েছে। এটি পরীক্ষা করে দেখুন।

https://github.com/joeferraro/react-native-env/pull/9


3
উল্লিখিত বিকল্প পদ্ধতির সরবরাহের জন্য উত্সাহিত। কোনও একটি আকার সব ফিট করে না।
জোশ হাবদাস

অ্যাসিঞ্চ পুল টু রেকর্ডটি মার্জ করা হয়েছে
jcollum

5
প্রতিক্রিয়া নেটিভ- env ​​অ্যান্ড্রয়েড সমর্থন করতে প্রদর্শিত হবে না। আলোচ্য বিষয়টি কি?
jcollum

3

আমি একই সমস্যার জন্য প্রাক বিল্ড স্ক্রিপ্ট তৈরি করেছি কারণ ভিন্ন পরিবেশের জন্য আমার কিছু বিবিধ এপিআই শেষ পয়েন্ট প্রয়োজন because

const fs = require('fs')

let endPoint

if (process.env.MY_ENV === 'dev') {
  endPoint = 'http://my-api-dev/api/v1'
} else if (process.env.MY_ENV === 'test') {
  endPoint = 'http://127.0.0.1:7001'
} else {
  endPoint = 'http://my-api-pro/api/v1'
}

let template = `
export default {
  API_URL: '${endPoint}',
  DEVICE_FINGERPRINT: Math.random().toString(36).slice(2)
}
`

fs.writeFile('./src/constants/config.js', template, function (err) {
  if (err) {
    return console.log(err)
  }

  console.log('Configuration file has generated')
})

এবং আমি প্রতিক্রিয়া-দেশীয় রান চালানোরnpm run scripts জন্য একটি কাস্টম তৈরি করেছি ..

আমার প্যাকেজ-জেসন

"scripts": {
    "start-ios": "node config-generator.js && react-native run-ios",
    "build-ios": "node config-generator.js && react-native run-ios --configuration Release",
    "start-android": "node config-generator.js && react-native run-android",
    "build-android": "node config-generator.js && cd android/ && ./gradlew assembleRelease",
    ...
}

তারপরে আমার পরিষেবাগুলির উপাদানগুলিতে কেবল স্বয়ংক্রিয়ভাবে উত্পন্ন ফাইলটি আমদানি করুন:

import config from '../constants/config'

fetch(`${config.API_URL}/login`, params)

3

পদক্ষেপ 1: এই উপাদানটির মতো পৃথক উপাদান তৈরি করুন: পেজবেজ.জেএস
পদক্ষেপ 2: এই ব্যবহারের কোডটির অভ্যন্তরে এটি করুন

    export const BASE_URL = "http://192.168.10.10:4848/";
    export const API_KEY = 'key_token';

পদক্ষেপ 3: এটি যে কোনও উপাদানটিতে এটি ব্যবহার করুন, এটি ব্যবহারের জন্য প্রথমে এই উপাদানটি আমদানি করুন তারপর এটি ব্যবহার করুন। এটি আমদানি করুন এবং এটি ব্যবহার করুন:

        import * as base from "./pagebase";

        base.BASE_URL
        base.API_KEY

2

আমি ব্যবহার করি babel-plugin-transform-inline-environment-variables

আমি যা করেছি তা আমার ভিন্ন পরিবেশের সাথে এস 3 এর মধ্যে একটি কনফিগারেশন ফাইল স্থাপন করা হয়েছিল।

s3://example-bucket/dev-env.sh
s3://example-bucket/prod-env.sh
s3://example-bucket/stage-env.sh

প্রতিটি এনভিলি ফাইল:

FIRSTENV=FIRSTVALUE
SECONDENV=SECONDVALUE

এরপরে, আমি আমার মধ্যে একটি নতুন স্ক্রিপ্ট যুক্ত করেছি package.jsonযা বান্ডিলিংয়ের জন্য একটি স্ক্রিপ্ট চালায়

if [ "$ENV" == "production" ]
then
  eval $(aws s3 cp s3://example-bucket/prod-env.sh - | sed 's/^/export /')
elif [ "$ENV" == "staging" ]
then
  eval $(aws s3 cp s3://example-bucket/stage-env.sh - | sed 's/^/export /')
else
  eval $(aws s3 cp s3://example-bucket/development-env.sh - | sed 's/^/export /')
fi

react-native start

আপনার অ্যাপ্লিকেশনটির মধ্যে আপনার কাছে সম্ভবত একটি কনফিগার ফাইল থাকবে:

const FIRSTENV = process.env['FIRSTENV']
const SECONDENV = process.env['SECONDENV']

যা বাবেলে প্রতিস্থাপন করা হবে:

const FIRSTENV = 'FIRSTVALUE'
const SECONDENV = 'SECONDVALUE'

মনে রাখবেন, এখন ব্যবহার করতে হবে process.env['STRING']না process.env.STRINGবা এটি সঠিকভাবে রূপান্তর করা হবে না।


REMEMBER you have to use process.env['STRING'] NOT process.env.STRING or it won't convert properly.ধন্যবাদ! এই যে আমাকে ট্রিপস !!!
স্টিভেন ইয়াপ

1

[উৎস] আমি যা খুঁজে পেয়েছি, এটি ডিফল্টরূপে দেখে মনে হচ্ছে, কেবল উত্পাদন এবং বিকাশের কনফিগারেশন করা সম্ভব (কোনও মঞ্চ বা অন্যান্য পরিবেশ নেই) - তা কি ঠিক?

এখনই, আমি একটি এনভায়রনমেন্ট.জেএস ফাইল ব্যবহার করছি যা এক্সপো রিলিজ চ্যানেলগুলি সনাক্ত করতে এবং তার ভিত্তিতে ফিরে আসা ভেরিয়েবলগুলি পরিবর্তন করতে ব্যবহার করা যেতে পারে, তবে বিল্ডিংয়ের জন্য আমাকে মঞ্চস্থ হওয়ার জন্য ফিরে আসা নন- ডিইভি ভেরিয়েবলটি আপডেট করতে হবে বা শঙ্কু:

import { Constants } from 'expo';
import { Platform } from 'react-native';
const localhost = Platform.OS === 'ios' ? 'http://localhost:4000/' : 'http://10.0.2.2:4000/';
const ENV = {
  dev: {
    apiUrl: localhost,
  },
  staging: {
    apiUrl: 'https://your-staging-api-url-here.com/'
  },
  prod: {
    apiUrl: 'https://your-prod-api-url-here.com/'
  },
}
const getEnvVars = (env = Constants.manifest.releaseChannel) => {
  // What is __DEV__ ?
  // This variable is set to true when react-native is running in Dev mode.
  // __DEV__ is true when run locally, but false when published.
  if (__DEV__) {
    return ENV.dev;
  } else {
    // When publishing to production, change this to `ENV.prod` before running an `expo build`
    return ENV.staging;
  }
}
export default getEnvVars;

বিকল্প

এক্সপো দিয়ে নির্মিত প্রকল্পগুলির জন্য কারও কি রিএ্যাক্ট-নেটিভ-ডটেনভ ব্যবহারের অভিজ্ঞতা আছে? আমি আপনার চিন্তা শুনতে ভাল লাগবে

https://github.com/zetachang/react-native-dotenv


আপনি নিজের ইচ্ছে মতো রিলিজ চ্যানেলের নামগুলি সংজ্ঞায়িত করতে পারেন এবং আপনার পরিবেশের পরিবর্তনশীলকে সংজ্ঞায়িত করতে নামটি পরীক্ষা করতে পারেন। যেখানে আমি দেখতে পাচ্ছি সীমাবদ্ধতাটি সেই পরিবেশ পরিবেশে যেখানে রিলিজচ্যানেল অপরিজ্ঞাত। সুতরাং আপনি বাবেল-প্লাগইন-ট্রান্সফর্ম-ইনলাইন-এনভায়রনমেন্ট-ভেরিয়েবলগুলি ব্যবহার করতে পারেন - আপনি যদি আপনার স্ক্রিপ্ট এবং রেফারেন্স প্রসেসে এনভায়রনমেন্ট ভেরিয়েবলগুলি পাস করতে পারেন en তবে ['VAR_NAME'] আপনার এনভায়রনমেন্ট.জেএস ফাইলটিতে?
কোলেমারিক

0

আপনার বিভিন্ন এনভ স্ক্রিপ্ট থাকতে পারে: product.env.sh વિકાસ.env.sh product.env.sh

এবং তারপরে কাজ শুরু করার সময় এগুলিকে উত্সবদ্ধ করুন [যা কেবলমাত্র একটি উপনামের সাথে আবদ্ধ) সুতরাং সমস্ত sh ফাইলটি প্রতিটি এনভির ভেরিয়েবলের জন্য রফতানি করা হয়:

export SOME_VAR=1234
export SOME_OTHER=abc

এবং তারপরে ব্যাবেল-প্লাগ-ইন-ট্রান্সফর্ম-ইনলাইন-এনভায়রনমেন্ট-ভেরিয়েবলগুলি যুক্ত করা তাদের কোডটিতে অ্যাক্সেসের অনুমতি দেবে:

export const SOME_VAR: ?string = process.env.SOME_VAR;
export const SOME_OTHER: ?string = process.env.SOME_OTHER;

আপনি কি কিছু যোগ করছেন @chapinkapa বলেননি?
ম্যাক্সিমো ডোমিংয়েজ

0

@ চম্পিংপা উত্তর ভাল answer মোবাইল কেন্দ্র যেহেতু পরিবেশের ভেরিয়েবলগুলি সমর্থন করে না, সে জন্য আমি গ্রহণ করেছি, একটি নেটিভ মডিউলটির মাধ্যমে বিল্ড কনফিগারেশনটি প্রকাশ করা:

অ্যান্ড্রয়েডে:

   @Override
    public Map<String, Object> getConstants() {
        final Map<String, Object> constants = new HashMap<>();
        String buildConfig = BuildConfig.BUILD_TYPE.toLowerCase();
        constants.put("ENVIRONMENT", buildConfig);
        return constants;
    } 

বা আইওএসে:

  override func constantsToExport() -> [String: Any]! {
    // debug/ staging / release
    // on android, I can tell the build config used, but here I use bundle name
    let STAGING = "staging"
    let DEBUG = "debug"

    var environment = "release"
    if let bundleIdentifier: String = Bundle.main.bundleIdentifier {
      if (bundleIdentifier.lowercased().hasSuffix(STAGING)) {
        environment = STAGING
      } else if (bundleIdentifier.lowercased().hasSuffix(DEBUG)){
        environment = DEBUG
      }
    }

    return ["ENVIRONMENT": environment]
  }

আপনি বিল্ড কনফিগারেশনটি সিঙ্ক্রোনাসলি পড়তে পারেন এবং জাভাস্ক্রিপ্টে সিদ্ধান্ত নিতে পারেন আপনি কীভাবে আচরণ করবেন।


0

process.env.blablaপরিবর্তে এর সাথে ভেরিয়েবলগুলি অ্যাক্সেস করা সম্ভব process.env['blabla']। আমি সম্প্রতি এটি কাজ করেছিলাম এবং গিটহাবের কোনও ইস্যুতে আমি এটি কীভাবে করেছি তাতে মন্তব্য করেছি কারণ গ্রহণযোগ্য উত্তরের ভিত্তিতে ক্যাশে নিয়ে আমার কিছু সমস্যা ছিল had বিষয়টি এখানে


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.