কীভাবে মেকফাইলে শিশু প্রসেসের পরিবেশের পরিবর্তনশীল সেট করা যায়


135

আমি এই মেকফিলটি পরিবর্তন করতে চাই:

SHELL := /bin/bash
PATH  := node_modules/.bin:$(PATH)

boot:
    @supervisor         \
      --harmony         \
      --watch etc,lib       \
      --extensions js,json      \
      --no-restart-on error     \
        lib

test:
    NODE_ENV=test mocha         \
      --harmony             \
      --reporter spec       \
        test

clean:
    @rm -rf node_modules

.PHONY: test clean

প্রতি:

SHELL := /bin/bash
PATH  := node_modules/.bin:$(PATH)

boot:
    @supervisor         \
      --harmony         \
      --watch etc,lib       \
      --extensions js,json      \
      --no-restart-on error     \
        lib

test: NODE_ENV=test
test:
    mocha                   \
      --harmony             \
      --reporter spec       \
        test

clean:
    @rm -rf node_modules

.PHONY: test clean

দুর্ভাগ্যক্রমে দ্বিতীয়টি কাজ করে না (নোড প্রক্রিয়াটি এখনও ডিফল্ট দিয়ে চলে NODE_ENV

আমি কি থেকে বাতিল হলাম?

উত্তর:


153

মেক ভেরিয়েবলগুলি প্রসেসের পরিবেশে রফতানি হয় না ডিফল্টরূপে ইনভয়েসগুলি তৈরি করুন ... তবে আপনি exportতাদের এটি করতে বাধ্য করার জন্য মেকস ব্যবহার করতে পারেন। পরিবর্তন:

test: NODE_ENV = test

এটি:

test: export NODE_ENV = test

(ধরে নিলাম আপনার কাছে জিএনইউ তৈরির যথেষ্ট আধুনিক সংস্করণ রয়েছে> = 3.77)।


3
আমার জিএনইউ ৩.৮১ all: <\n\t>export PROJ_ROOT=$(CURDIR)<\n\t>echo $(PROJ_ROOT)<\n>করেছে এবং প্রথম সারির জন্য সঠিক প্রসারণ আউটপুট করে তবে কেবল echoদ্বিতীয়টির জন্য। PROJ_ROOTমেক চলমান পরে সেট করা হয় না। আশেপাশের স্থানগুলি =রফতানির জন্য "খারাপ ভেরিয়েবল নাম" দেয়। আপনার উদাহরণ হিসাবে পূর্বশর্ত হিসাবে প্রথম সারির "কমান্ড প্রথম লক্ষ্য আগে শুরু" দেয়
গৌথির

8
@ গৌথির হ্যাঁ অবশ্যই আমি যা লিখেছি তা নয়। আপনি এর পরে একটি <\ n \ t> যুক্ত করেছেন all:, যা আমার উদাহরণে নেই। আমার উদাহরণটি লিখিত হিসাবে ব্যবহারের উদ্দেশ্যে রয়েছে: এটি একটি লক্ষ্য-নির্দিষ্ট ভেরিয়েবলের সংজ্ঞা দিচ্ছে, রেসিপিটিতে কোনও আদেশ যোগ না করে। এছাড়াও আপনি একই সময়ে কোনও লক্ষ্যতে একটি রেসিপি এবং লক্ষ্য-নির্দিষ্ট ভেরিয়েবল ব্যবহার করতে পারবেন না: আপনাকে লক্ষ্যটি দু'বার লিখতে হবে। প্রশ্নের দ্বিতীয় উদাহরণটি দেখুন এবং একটি নতুন প্রশ্ন জিজ্ঞাসা করুন যদি এটি এটি ব্যাখ্যা করতে সহায়তা না করে: মন্তব্যগুলিতে পর্যাপ্ত জায়গা বা বিন্যাস নেই।
ম্যাড সায়েন্টিস্ট

1
একাধিক ভেরিয়েবল সম্পর্কে কি?
holms

1
এটি ঠিক আছে তবে আপনি লক্ষ্যের সাথে এটি যোগ করেছেন। টার্গেটের প্রসঙ্গে তাদের তালিকাভুক্তি কি কাজ করবে না? কারণ এটি আমার পক্ষে কার্যকর নয়
holms

2
লক্ষ্য-নির্দিষ্ট ভেরিয়েবলগুলি GNU Make 3.77 এ যুক্ত করা হয়েছিল। এগুলি জিএনইউ 3.81 এর হিসাবে এক্সপোর্টযোগ্য। দেখুন git.savannah.gnu.org/cgit/make.git/tree/NEWS
MadScientist

79

ম্যাড সায়েন্টিস্ট যেমন উল্লেখ করেছেন , আপনি পৃথক ভেরিয়েবলগুলি এর সাথে রফতানি করতে পারেন:

export MY_VAR = foo  # Available for all targets

বা একটি নির্দিষ্ট লক্ষ্য ( লক্ষ্য-নির্দিষ্ট ভেরিয়েবল ) এর জন্য রফতানযোগ্য ভেরিয়েবলগুলি :

my-target: export MY_VAR_1 = foo
my-target: export MY_VAR_2 = bar
my-target: export MY_VAR_3 = baz

my-target: dependency_1 dependency_2
  echo do something

আপনি .EXPORT_ALL_VARIABLESলক্ষ্যটিও নির্দিষ্ট করতে পারেন - আপনি এটি অনুমান করেছেন!

.EXPORT_ALL_VARIABLES:

MY_VAR_1 = foo
MY_VAR_2 = bar
MY_VAR_3 = baz

test:
  @echo $$MY_VAR_1 $$MY_VAR_2 $$MY_VAR_3

দেখতে .EXPORT_ALL_VARIABLES


2
অদ্ভুতভাবে আমি আগে এটি পরীক্ষা করেছিলাম যা এটি কাজ করে দেখিয়েছে .. (এখনই কেন জানি না ..) আমি ফিরে গিয়ে আমার যে মন্তব্যটি অনুমান করা যায় তা মুছতে পারি ..
অ্যান্থনি সি

3
@ MY_VARঅ্যান্টনি সি এটি কাজ করে কারণ সেখানে দুটি গুলি রয়েছে: একটিতে মেকফিল পরিবর্তনশীল হিসাবে অ্যাক্সেস করা হয় ${MY_VAR}এবং অন্যটি বাশ রফতানি চলক হিসাবে প্রবেশ করা হয়$$MY_VAR
সের্গেই

উপকারী। তবে কেবলমাত্র ভেরিয়েবলগুলির একটি সেট রফতানির উপায় খুঁজে পাচ্ছে না।
এরিক চেন

15

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

SHELL := /bin/bash

.PHONY: test tests
test tests:
    PATH=./node_modules/.bin/:$$PATH \
    JSCOVERAGE=1 \
    nodeunit tests/

6
কিছু ব্যাখ্যা অন্তর্ভুক্ত করতে দয়া করে আপনার উত্তর সম্পাদনা করুন। কোড-কেবলমাত্র উত্তরগুলি ভবিষ্যতের এসও পাঠকদের শিক্ষিত করতে খুব কম করে। আপনার উত্তরটি নিম্নমানের হওয়ার জন্য সংযম কাতারে।
মিকম্যাকুসা

থারস্মমনার, এই সমাধানটি উপরের পদ্ধতির মতো নমনীয় নয়। উদাহরণস্বরূপ, কমান্ড চাওয়ার জন্য একটির একটি নিয়ম থাকতে পারে এবং তারপরে আরও কয়েকটি নিয়ম থাকতে পারে যা পরিবেশের ভেরিয়েবলগুলি সেট করে সেই আচরণটি পরিবর্তন করে। বিবেচনা করুন: পরীক্ষা: সেমিডি পারফ: এক্সপোর্ট PERF = "হ্যাঁ" পারফ: পরীক্ষা যদি 'সেমিডি' জটিল হয় (এবং এটি সাধারণত হয়) তবে এই পদ্ধতিটি বজায় রাখা অনেক সহজ। সেন্টিমিটার নিয়মে পরিবেশ পরিবর্তনশীল সেট করার আপনার পদ্ধতির বিষয়টি আরও জটিল করে তুলেছে।
কিথ হ্যানলান

1

আমি আসল টার্গেট টেস্টটি আবার লিখব, প্রয়োজনীয় ভেরিয়েবলটি চালু করার আবেদন হিসাবে একই সাব-প্রসেসে সংজ্ঞায়িত করা হয়েছে:

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