একাধিক সরল জাভাস্ক্রিপ্ট আউটপুট ফাইলগুলি তৈরি করতে সাধারণ নির্ভরতা সহ একটি টাইপস্ক্রিপ্ট প্রকল্প কনফিগার করুন


10

আমি বর্তমানে বট ল্যান্ডের জন্য কিছু স্ক্রিপ্ট লিখছি । বট ল্যান্ড একটি বাস্তব-সময়ের কৌশল খেলা যেখানে মাউস এবং কীবোর্ডের সাহায্যে আপনার ইউনিটগুলি নিয়ন্ত্রণ করার পরিবর্তে আপনি একটি API এর মাধ্যমে আপনার বটগুলি নিয়ন্ত্রণ করার জন্য কোড লিখেন এবং তারপরে আপনার বটগুলি অন্যের বোটের সাথে লড়াই করে। আপনি যদি এসসি 2-র ইউনিটগুলির সাথে পরিচিত হন তবে আপনি এমন বট তৈরি করতে পারেন যা ঝলকানো স্ট্যালার, অবরোধের ট্যাঙ্ক, মেডিক্স এবং আল্ট্রালিস্কের মতো। (এটি সফ্টওয়্যার ইঞ্জিনিয়ারদের জন্য বেশ মজাদার একটি খেলা তবে এটি এই প্রশ্নের ক্ষেত্রের বাইরে))

বট জমি

বট কন্ট্রোলের ক্রমবর্ধমান জটিলতার তিনটি স্তর রয়েছে: একটি ডিফল্ট এআই, একটি স্ক্র্যাচ-জাতীয় প্রোগ্রামিং ভাষা এবং জাভাস্ক্রিপ্টের একটি হ্রাস সেট जिसे বটল্যান্ডস্ক্রিপ্ট বলে। যদিও বটল্যান্ডস্ক্রিপ্টের জন্য অন্তর্নির্মিত সম্পাদক যুক্তিসঙ্গত, আপনাকে সর্বত্র বিশ্বব্যাপী শীর্ষ স্তরের ফাংশন সহ আপনার সমস্ত কোড একক ফাইল হিসাবে আপলোড করতে হবে । স্বাভাবিকভাবেই, যদি আপনার কোড দীর্ঘ হতে শুরু করে এবং বিভিন্ন বট একই ক্রিয়াকলাপটি ভাগ করে শুরু করে তবে কিছুক্ষণ পরে এটি বেদনাদায়ক হতে শুরু করে।

প্রোগ্রামিং পরিবেশ

একাধিক বটের জন্য কোড লেখার সুবিধার্থে, খালি জেএসে কোডিং করার সময় অজান্তেই ত্রুটির সম্ভাবনা হ্রাস করতে এবং অন্যান্য খেলোয়াড়দের মারধর করার সম্ভাবনা বাড়ানোর জন্য, আমি আমার প্রতিটি বটগুলির জন্য একটি সাধারণ লাইব্রেরি সহ কোড সরবরাহ করার জন্য উপরের টাইপস্ক্রিপ্ট প্রকল্পটি সেট আপ করেছি । বর্তমান ডিরেক্টরি কাঠামোটি নিম্নলিখিতগুলির মতো দেখতে প্রায়:

lib/ 
  bot.land.d.ts
  common.ts
BlinkStalker/
  BlinkStalker.ts
  tsconfig.json
Artillery/
  Artillery.ts
  tsconfig.json
SmartMelee/
  SmartMelee.ts
  tsconfig.json

libহ'ল সাধারণ কোড যা বটগুলির মধ্যে ভাগ করা হয় এবং (টিএসএস নন) বট ল্যান্ড এপিআইয়ের জন্য টাইপস্ক্রিপ্ট সংজ্ঞা সরবরাহ করে। এর পরে প্রতিটি বট তার নিজস্ব ফোল্ডার পায়, যার মধ্যে একটি ফাইল বট কোড এবং অন্যটি বয়লারলেট থাকে tsconfig.json:

{
  "compilerOptions": {
    "target": "es3",
    "module": "none",
    "sourceMap": false,
    "outFile": "bot.js"
  },
  "files": [
    "MissileKite.ts"
  ],
  "include": [
    "../lib/**/*"
  ]
}

যখন প্রতিটি tsconfig.jsonনির্মিত হয়, এটি একটি সংশ্লিষ্ট সৃষ্টি bot.jsবট নিজেই সেইসাথে থেকে transpiled রয়েছে কোড সব কোড common.js। এই সেটআপটি কয়েকটি কারণে সাবঅপটিমাল, অন্যদের মধ্যে: এটির জন্য প্রচুর নকল বয়লারপ্লেট প্রয়োজন, নতুন বট যুক্ত করা শক্ত করে তোলে, প্রতিটি বটের জন্য প্রচুর অপ্রয়োজনীয় কোড অন্তর্ভুক্ত থাকে এবং প্রতিটি বট পৃথকভাবে তৈরি করা প্রয়োজন।

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

নিম্নলিখিতটি যতটা সম্ভব অর্জনের সর্বোত্তম উপায়?

  • নতুন বট যোগ করার জন্য কোনও নতুন বয়লারপ্লেটের প্রয়োজন নেই (যেমন tsconfig.jsonবট প্রতি কোনও নয় )
  • importঅব্যবহৃত কোড আউটপুট এড়ানোর জন্য সাধারণ ফাংশনগুলির জন্য ব্যবহার করুন তবে তারপরে ...
  • তবুও বট ল্যান্ডের নির্দিষ্ট ফর্ম্যাটে একক ফাইল হিসাবে সমস্ত ফাংশন আউটপুট দেয়
  • একক বিল্ড স্টেপ যা একাধিক আউটপুট ফাইল তৈরি করে, প্রতিটি বটের জন্য একটি করে
  • বোনাস: ভিএস কোডের সাথে বিল্ড প্রক্রিয়া একীকরণ করা। tasks.jsonপ্রতিটি উপ-প্রকল্প তৈরির জন্য বর্তমানে একইভাবে বয়লারপ্লেট রয়েছে ।

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


সমস্ত বটগুলির আলাদা আলাদা ফোল্ডার থাকা দরকার? বা এটি কি যথেষ্ট যে প্রতিটি বট একক ফাইলের মূল স্তরে থাকে? (উদাঃ <root>/MissileKite.ts)
a1300

1
সমস্ত ট্রান্সপ্লান্সড বট-ফাইলের নাম দেওয়া উচিত bot.js?
1300

একটি একক ফাইলে রুট করাই শ্রেয়; পৃথক কারণে তারা পৃথক ফোল্ডারে tsconfig.json। ট্রান্সপ্লাইল করা বট ফাইলগুলিকে যেকোনও নাম দেওয়া যেতে পারে, মূলত মূল ফাইলটির .js সংস্করণ। আমি রেপো আউটপুটটিং এ এখন এই ভাবে সেট আপ করেছি build/MissileKite.js
অ্যান্ড্রু মাও

1
@ অ্যান্ড্রু-মাও আপনি জিএএস প্রকল্পগুলির জন্য আমার টেমপ্লেটটি দিতে পারেন যা আপনার প্রয়োজনীয়তার বেশিরভাগ অংশগুলিকে সম্বোধন করে (তবে ভিন্ন পরিবেশকে লক্ষ্য করে) যদি এটি আপনার পক্ষে উপযুক্ত হয় তবে আমি পরের সপ্তাহে এটি আপনার জন্য খাপ খাইয়ে নিতে সক্ষম হব। github.com/PopGoesTheWza/ts-gas-project-starter
পপগোসডব্লিউজেডা

tsconfig-gas.jsonপ্রাসঙ্গিক জিনিস কি সেখানে তাকান?
অ্যান্ড্রু মাও

উত্তর:


2

আপনার প্রয়োজনীয়তার উত্তর দেওয়ার জন্য আমার চেষ্টা এখানে ।

উল্লেখযোগ্য ফাইল:

  • src/tsconfig-botland.jsonযে কোনও বট.ল্যান্ড স্ক্রিপ্টের জন্য সেটিংস ধারণ করে (আপনার কাস্টম ঘোষণাগুলি সহ যা আমি চলেছিtypes/bot-land/index.d.ts )। আপনি যা ব্যবহার করতে পারেন strictসেটিংস পরিবর্তন করতে ।
  • src/tsconfig.jsonআপনার সমস্ত বট রেফারেন্স রাখে। আপনি যখনই অন্য বট স্ক্রিপ্ট যুক্ত করতে চান তখন সম্পাদনা করার জন্য এই ফাইলটি

একটি বট স্ক্রিপ্ট হ'ল কমপক্ষে দুটি ফাইল: একটি মিনিমালিস্ট tsconfig.jsonএবং এক বা একাধিক .tsস্ক্রিপ্ট ফাইল।

উদাহরণস্বরূপ src/AggroMiner/tsconfig.json:

{
    "extends": "../tsconfig-botland",
    "compilerOptions": {
        "outFile": "../../build/AggroMiner.js"
    },
    "files": ["index.ts"],
    "include": ["**/*.ts", "../lib/**/*.ts"]
}

বেশিরভাগ ক্ষেত্রে, একটি নতুন বট স্ক্রিপ্ট শুরু করার জন্য আপনার উচিত:

  1. কোনও বট ফোল্ডার (যেমন src/AggroMiner) এর অধীনে একটি নতুন ফোল্ডারে অনুলিপি করুনsrc
  2. সম্পাদন করা src/<newBotFolder>/tsconfig.jsonসম্পাদনা করতে outFileআপনার বট নামে
  3. সম্পাদনা করুন src/tsconfig.jsonএবং এতে একটি রেফারেন্স যুক্ত করুনsrc/<newBotFolder>

নিম্নলিখিত npm/ yarnস্ক্রিপ্ট সেট করা হয়েছে:

  • build সমস্ত বট নির্মাণ
  • build-cleanযা buildচালানোর আগে ফোল্ডারটি সাফ করেbuild
  • formatএর .tsঅধীনে সমস্ত ফাইলগুলিতে প্রিটটিয়ার চালাতেsrc
  • lint সমস্ত বট স্ক্রিপ্টে tslint চেক চালাতে

আপনার প্রয়োজনীয়তা এখন চলছে:

  • নতুন বট যোগ করার জন্য কোনও নতুন বয়লারপ্লেটের প্রয়োজন নেই (যেমন বট প্রতি tsconfig.json নয়)

এটি অর্জনের জন্য এমন কিছু স্ক্রিপ্ট তৈরি করা দরকার যা আপনার বট ফোল্ডার / স্ক্রিপ্টগুলি গণনা করবে ... এবং প্রতি বট tsconfig.jsonএবং চালনার সাথে সম্পর্কিত প্রাসঙ্গিক সেটআপ করবে tsc। এটি কঠোরভাবে প্রয়োজনীয় না হলে একটি ন্যূনতম সেটআপ (উপরে বর্ণিত) যথেষ্ট হতে পারে।

  • অব্যবহৃত কোড আউটপুট এড়াতে সাধারণ ফাংশনগুলির জন্য আমদানি ব্যবহার করুন, তবে তারপরে ...

প্রথমে সচেতন থাকুন যে আপনি যদি কোনও মডিউল export/ importবিবৃতি ব্যবহার শুরু করেন তবে একক ফাইল আউটপুট অর্জনের জন্য আপনার তৃতীয় পক্ষের প্যাক / ট্রিশেকের প্রয়োজন হবে। আমি বট.ল্যান্ডের যা সংগ্রহ করতে পারি তার থেকে আপনার স্ক্রিপ্টগুলি সার্ভারে চলছে। ডেডকোডটি যদি আপনার বটের পারফরম্যান্সে প্রভাব না ফেলে আমি সত্যিই বিরক্ত হব না।

  • তবুও বট ল্যান্ডের নির্দিষ্ট ফর্ম্যাটে একক ফাইল হিসাবে সমস্ত ফাংশন আউটপুট দেয়

সম্পন্ন.

  • একক বিল্ড স্টেপ যা একাধিক আউটপুট ফাইল তৈরি করে, প্রতিটি বটের জন্য একটি করে

সম্পন্ন.

  • বোনাস: ভিএস কোডের সাথে বিল্ড প্রক্রিয়া একীকরণ করা। প্রতিটি উপ-প্রকল্প তৈরির জন্য বর্তমানে একইভাবে বয়লারপ্লেট টাস্ক.জসন রয়েছে।

npmস্ক্রিপ্ট vsc এর কর্ম তালিকায় প্রদর্শিত হবে (অন্তত তারা আমার না) এইভাবে তৈরীর tasks.jsonঅপ্রয়োজনীয়।


আপনি এখানে তৈরি সমস্ত কিছুর জন্য ডেডকোড একটি সূক্ষ্ম সমঝোতা; আপনি কেন types/bot-landসংজ্ঞাগুলির জন্য ব্যবহার করেছেন এবং কেন আপনি strictসেটিংস পছন্দ করেছেন তা আমাকে জানতে দিতে পারেন ?
অ্যান্ড্রু মাও

প্রকার / বট-ল্যান্ড / সূচক.ড.টিস হ'ল লাইব থেকে আপনার মূল .d.ts, নাম পরিবর্তন করে আলাদাভাবে স্থাপন করা। Ume ধরে নিন এটিকে সমস্ত স্ক্রিপ্টগুলির জন্য সাধারণ বোট.ল্যান্ড এক্সিকিউশন প্রসঙ্গে বর্ণনা করা যায় এবং সুতরাং আমি নিশ্চিত করি যে এটি প্রতিটি বট স্ক্রিপ্টে সর্বদা উপলব্ধ। 'কঠোর' সেটিংসটি কেবল এখানেই রয়েছে কারণ আমি অলসভাবে আমার পছন্দসই সেটিংসগুলি অনুলিপি করে রেখেছি (প্রিটিয়ারের সেটিংসের জন্য একই)। এগুলি ব্যবহারকারীর (আপনার) পছন্দ অনুসারে মানিয়ে নেওয়া উচিত।
পপগোসডব্লিউজেডা

আমি কেবল ভাবছি যে এটি toোকানোর কোনও প্রথাগত কারণ আছে typesবা এটি যদি আপনি বেছে নেওয়ার ব্যবস্থা করার নির্দিষ্ট উপায় ছিল was
অ্যান্ড্রু মাও

একমাত্র কারণ এটি ধরে নেওয়া বটল্যান্ডল্যান্ড প্রসঙ্গ ছিল। আপনার নোডেজ স্ক্রিপ্টগুলিতে @ টাইপ / নোড টাইপগুলি ইতিমধ্যে উপলব্ধ থাকার মতো ভাবেন
পপগোসডব্লিউজেডা

1
এ / প্রকারের ফোল্ডারটি প্রচলিত স্থানগুলির মধ্যে একটি যেখানে কোনও বাহ্যিক ধরণের ঘোষণাগুলি রাখে (যেমন বোটল্যান্ড ইঞ্জিন বা টাইপযুক্ত জাভাস্ক্রিপ্ট মডিউল / প্যাকেজগুলির মতো নির্দিষ্ট প্রয়োগের প্রসঙ্গ, যা এখানে ব্যবহার করা হয় না)
পপগো দ্য ওয়াজকা

3

আপনি প্রকৃতপক্ষে প্রকল্পের রেফারেন্স ব্যবহার করতে পারেন। এক ফাইলের শীর্ষ স্তরের সমস্ত ফাংশন সহ আপনি আপনার আসল ফাইলগুলির জন্য একই ফলাফলটি পেতে এই পদক্ষেপগুলি অনুসরণ করুন। তবে, বটগুলিতে কেবল প্রয়োজনীয় ফাংশন আমদানির কোনও সমাধান আমি খুঁজে পেলাম না। অর্থাৎ আমদানি ও রফতানি ব্যবহার না করেই।

মূলে আপনার tsconfig.json এ

{
    "files": [],
    "references": [
        { "path": "./lib" }
        { "path": "./AggroMiner" }
        { "path": "./ArtilleryMicro" }
        { "path": "./MissileKite" }
        { "path": "./SmartMelee" }
        { "path": "./ZapKite" }
    ]
}

এর পরে, আপনার লিবিব ফোল্ডারে, এমন একটি tsconfig.json যুক্ত করুন

{
  "compilerOptions": {
    "declaration": true,
    "declarationMap": true,
    "composite": true,
    "rootDir": ".",
    "outFile": "../build/lib.js",
    "target": "es3",
    "removeComments": true,
    "sourceMap": false,
  },
  "files": [
    "data.ts",
    "movement.ts",
    "utils.ts"
  ]
}

আমাদের ডেটা.টিস, মুভমেন্ট.টস এবং ইউস.স.টে কয়েকটি সমন্বয় করা দরকার যাতে টিএস সংকলনের ত্রুটিগুলি আমাদের বিরক্ত না করে।

data.ts

/// <reference path="./bot.land.d.ts"/>

(...)

movement.ts


/// <reference path="./data.ts"/>
/// <reference path="./utils.ts"/>
(...)

utils.ts

/// <reference path="./bot.land.d.ts"/>
(...)

এরপরে, আমরা মূলটিতে বেস.জসন যুক্ত করব (বটগুলির tsconfig.json এটি প্রসারিত করবে)।

base.json

{
  "compilerOptions": {
    "declaration": true,
    "composite": true,
    "rootDir": ".",
    "target": "es3",
    "removeComments": true,
    "sourceMap": false,
  }
}

এবং বটের 'tsconfig.json (বট অনুসারে অভিযোজিত)

{
  "extends": "../base",
  "compilerOptions": {
    "outFile": "../build/AggroMiner.js",
  },
  "files": [
    "AggroMiner.ts"
  ],
  "references": [
      { "path": "../lib", "prepend": true } //note the prepend: true
  ]
}

এটাই. এখন শুধু চালান

tsc -b

সুতরাং আমি এই জাতীয় কিছু ভেবেছিলাম, তবে এটি কাজ করে না তার কারণ হ'ল আপনার শাখায় যে ফাইলটি আউটপুট পায় তার উপরে এই ধরণের স্টাফ থাকে এবং গেমটিতে সমস্ত ফাংশন সহ একটি ফাইলের প্রয়োজন হয়। সুতরাং আমি নিজেই ফাইলটি তৈরির অনুলিপি কপি না করে যে ফাইলটি আপলোড করেছি তা তৈরি করতে আমাকে সমস্ত সংকলিত আউটপুট একসাথে আবদ্ধ করতে হবে। strict "কঠোর ব্যবহার করুন"; এক্সপোর্ট .__ এসমোডুল = সত্য; var ডেটা_1_ = প্রয়োজন ("../ lib / ডেটা"); var আন্দোলন = = প্রয়োজন ("../ lib / আন্দোলন"); var utils_1 = প্রয়োজনীয় ("../ lib / utils"); `
অ্যান্ড্রু মাও

কিন্তু এটি কাজ করে যেহেতু বিল্ড ফোল্ডারে আউটপুট (বিল্ট) হয় (রেফারেন্সের জন্য ধন্যবাদ)।
jperl

আমি আমার মন্তব্য সম্পাদনা করার প্রক্রিয়া করছিলাম - উপরে দেখুন। বা build/MissileKite.jsআপনি আসল রেপো তৈরি করার সময় সেটিকে আউটপুট করা হবে তা একবার দেখুন ।
অ্যান্ড্রু মাও

@ অ্যান্ড্রুমাও দুঃখিত, কেবল এখনই আমি বুঝতে পেরেছি আপনি কী বলতে চেয়েছিলেন "কারণ এর জন্য কোডটি মডুলারাইজ করা দরকার এবং বট ল্যান্ডের শীর্ষ স্তরে সংজ্ঞায়িত সমস্ত ফাংশন সহ একটি ফাইল প্রয়োজন requires" আমি "প্রিপেন্ড: ট্রু" ব্যবহার করার কথা ভেবেছিলাম তবে এর জন্য আউটফিল ব্যবহার করা দরকার এবং টিএস আমাদের লিবে ফাইলগুলি সংকলন করতে দেয় না কারণ কিছু অন্যের উপর নির্ভরশীল।
jperl

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