कई सादे जावास्क्रिप्ट आउटपुट फ़ाइलों का निर्माण करने के लिए सामान्य निर्भरता के साथ टाइपस्क्रिप्ट प्रोजेक्ट को कॉन्फ़िगर करें


10

मैं वर्तमान में बॉट लैंड के लिए कुछ स्क्रिप्ट लिख रहा हूं । बॉट लैंड एक वास्तविक समय की रणनीति का खेल है, जहां माउस और कीबोर्ड के साथ अपनी इकाइयों को नियंत्रित करने के बजाय, आप एपीआई के माध्यम से अपने बॉट्स को नियंत्रित करने के लिए कोड लिखते हैं, और फिर आपके बॉट दूसरों के बॉट से लड़ते हैं। यदि आप SC2 की इकाइयों से परिचित हैं, तो आप ऐसे बॉट बना सकते हैं जो ब्लिंक करने वाले, घेराबंदी करने वाले टैंक, मेडिक्स और अल्ट्रालिक्क्स के समान हैं। (यह सॉफ्टवेयर इंजीनियरों के लिए काफी मजेदार खेल है, लेकिन यह इस सवाल के दायरे से बाहर है।)

वट भूमि

बॉट नियंत्रण में जटिलता के तीन स्तर हैं: एक डिफ़ॉल्ट एआई, एक स्क्रैच -जैसी प्रोग्रामिंग भाषा, और जावास्क्रिप्ट का एक छोटा सेट जिसे बोटलस्क्रिप्ट्स कहा जाता है। यद्यपि बोटलैंडस्क्रिप्ट के लिए अंतर्निहित संपादक उचित है, आपको अपने सभी कोड को वैश्विक शीर्ष-स्तरीय फ़ंक्शन के साथ एक एकल फ़ाइल के रूप में हर जगह अपलोड करना होगा । स्वाभाविक रूप से, यह थोड़ी देर के बाद दर्दनाक होना शुरू हो जाता है यदि आपका कोड लंबा होना शुरू हो जाता है और विभिन्न बॉट समान कार्य साझा करते हैं।

प्रोग्रामिंग वातावरण

कई बॉट्स के लिए कोड लिखने की सुविधा के लिए, नंगे जेएस में कोडिंग के दौरान अनजाने में हुई त्रुटियों के लिए मौका कम करें, और अन्य खिलाड़ियों की पिटाई करने की मेरी संभावना को बढ़ाएं, मैंने एक टाइप लाइब्रेरी बनाने के लिए ऊपर टाइपस्क्रिप्ट प्रोजेक्ट स्थापित किया है और साथ ही साथ मेरे प्रत्येक डॉट्स के लिए कोड भी। । वर्तमान निर्देशिका संरचना निम्न की तरह लग रही है:

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है जिसमें बॉट से ट्रांसप्लड कोड के साथ-साथ सभी कोड शामिल होते हैं common.js। यह सेटअप कुछ कारणों से, दूसरों के बीच में है: इसके लिए बहुत सारे डुप्लिकेट बॉयलरप्लेट की आवश्यकता होती है, नए बॉट्स को जोड़ना मुश्किल बनाता है, प्रत्येक बॉट के लिए बहुत सारे अनावश्यक कोड शामिल हैं, और प्रत्येक बॉट को अलग से बनाने की आवश्यकता होती है।

हालाँकि, अब तक के मेरे शोध के आधार पर , ऐसा नहीं लगता कि मुझे जो करना है उसके लिए एक आसान तरीका है। विशेष रूप से, नए tsc -bविकल्प और संदर्भों का उपयोग करने से काम नहीं चलता है, क्योंकि कोड को संशोधित करने की आवश्यकता होती है और बॉट लैंड को शीर्ष स्तर पर परिभाषित सभी कार्यों के साथ एकल फ़ाइल की आवश्यकता होती है।

निम्नलिखित में से कितने को प्राप्त करने का सबसे अच्छा तरीका है?

  • नया बॉट जोड़ने के लिए किसी नए बॉयलरप्लेट की आवश्यकता नहीं है (जैसे tsconfig.jsonप्रति बॉट नहीं)
  • importअनुपयोगी कोड के आउटपुट से बचने के लिए सामान्य कार्यों के लिए उपयोग करें , लेकिन फिर ...
  • अभी भी सभी कार्यों को बोट लैंड के विशिष्ट प्रारूप में एक एकल फ़ाइल के रूप में आउटपुट करता है
  • एक एकल निर्मित कदम जो कई आउटपुट फ़ाइलों का उत्पादन करता है, प्रत्येक बॉट के लिए
  • बोनस: वीएस कोड के साथ निर्माण प्रक्रिया को एकीकृत करना। tasks.jsonप्रत्येक उप-परियोजना के निर्माण के लिए वर्तमान में एक बॉयलरप्लेट है ।

मैं स्पष्ट रूप से उत्तर देता हूं कि संभवतः इसके अलावा ग्रंट जैसी कोई चीज शामिल है tsc, लेकिन मुझे इस बारे में पर्याप्त जानकारी नहीं है।


क्या यह आवश्यक है कि सभी बॉट में अलग-अलग फ़ोल्डर हों? या क्या यह पर्याप्त है कि प्रत्येक बॉट एक फ़ाइल में रूट स्तर पर है? (उदा <root>/MissileKite.ts)
a1300

1
क्या सभी ट्रांसपोटेड बॉट-फाइल्स का नाम होना चाहिए bot.js?
a1300

एक एकल फ़ाइल में रूट बेहतर होगा; वे अलग फ़ोल्डर में हैं क्योंकि अलग हैं tsconfig.json। ट्रांसप्लड बॉट फ़ाइलों को कुछ भी नाम दिया जा सकता है, अधिमानतः मूल फ़ाइल का .js संस्करण। मैंने इसे इस तरह से अब रेपो आउटपुट में सेट किया है build/MissileKite.js
एंड्रयू माओ

1
@ andrew-mao आप एक नज़र GAS परियोजनाओं के लिए एक खाका दे सकते हैं जो आपकी अधिकांश आवश्यकताओं को संबोधित करता है (लेकिन एक अलग वातावरण को लक्षित करता है) यदि यह आपको सूट करता है, तो मैं अगले सप्ताह कुछ समय के लिए आपके लिए इसे अनुकूलित करने में सक्षम हो सकता हूं। github.com/PopGoesTheWza/ts-gas-project-starter
PopGoesTheWza

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तहत सभी फ़ाइलों पर Prettier चलाने के लिएsrc
  • lint सभी बॉट स्क्रिप्ट पर एक tslint जांच चलाने के लिए

अब नीचे अपनी आवश्यकताओं को चलाने:

  • नया बॉट जोड़ने के लिए किसी नए बायलरप्लेट की आवश्यकता नहीं है (उदाहरण के लिए बॉट प्रति tsconfig.json नहीं)

इसे प्राप्त करने के लिए कुछ स्क्रिप्ट बनाने की आवश्यकता होगी जो आपके बॉट्स फोल्डर / स्क्रिप्ट्स को एन्यूमरेट करेगी ... और संबंधित बॉट tsconfig.jsonऔर रन को सेटअप करेगी tsc। जब तक यह कड़ाई से आवश्यक नहीं है, एक न्यूनतम सेटअप (ऊपर वर्णित) पर्याप्त हो सकता है।

  • अप्रयुक्त कोड के आउटपुट से बचने के लिए सामान्य कार्यों के लिए आयात का उपयोग करें, लेकिन फिर ...

सबसे पहले, ध्यान रखें कि यदि आप किसी भी मॉड्यूल export/ importस्टेटमेंट का उपयोग करना शुरू करते हैं , तो आपको एकल फ़ाइल आउटपुट प्राप्त करने के लिए अतिरिक्त 3 पार्टी पैक / ट्रीशेक की आवश्यकता होगी। मैं Bot.land से क्या इकट्ठा कर सकता हूं, आपकी स्क्रिप्ट सर्वर पर चल रही है। जब तक आपके बॉट प्रदर्शन पर डेडकोड ​​का प्रभाव नहीं पड़ता, मैं वास्तव में परेशान नहीं होता।

  • अभी भी सभी कार्यों को बोट लैंड के विशिष्ट प्रारूप में एक एकल फ़ाइल के रूप में आउटपुट करता है

किया हुआ।

  • एक एकल निर्मित कदम जो कई आउटपुट फ़ाइलों का उत्पादन करता है, प्रत्येक बॉट के लिए

किया हुआ।

  • बोनस: वीएस कोड के साथ निर्माण प्रक्रिया को एकीकृत करना। प्रत्येक उप-परियोजना के निर्माण के लिए वर्तमान में एक बॉयलरप्लेट कार्य है।

npmस्क्रिप्ट VSC के कार्यों सूची में दिखाई देगा (कम से कम वे खान में करते हैं) इस प्रकार tasks.jsonअनावश्यक।


आपके द्वारा यहां बनाई गई हर चीज के लिए डेडकोड ​​एक अच्छा समझौता है; क्या आप मुझे बता सकते हैं कि आपने types/bot-landपरिभाषाओं का उपयोग क्यों किया और आपने strictसेटिंग क्यों चुनी ?
एंड्रयू माओ

प्रकार / बॉट-भूमि / index.d.ts वास्तव में आपकी मूल .d.ts है जो कि लीब से, नाम बदलकर अलग से रखी गई है। Î मान लें कि यह सभी लिपियों के लिए सामान्य बॉट.लैंड निष्पादन संदर्भ का वर्णन करता है और इस तरह मुझे यकीन है कि यह हमेशा हर बॉट लिपि में उपलब्ध है। 'सख्त' सेटिंग्स केवल यहाँ हैं क्योंकि मैंने अपनी पसंदीदा सेटिंग्स की प्रतिलिपि बनाई है (प्रीटीयर सेटिंग्स के लिए समान)। उन को उपयोगकर्ता (आप) वरीयता के लिए अनुकूलित किया जाना चाहिए।
PopGoesTheWza

मैं सोच रहा हूँ कि अगर वहाँ एक प्रथागत कारण है कि में डाल दिया है typesया अगर वह सिर्फ एक विशिष्ट तरीका है कि आप उठाया है।
एंड्रयू माओ

एकमात्र कारण यह है कि यह मानते हुए bot.land संदर्भ था। इसे ऐसे समझें जैसे कि आपके नोडज स्क्रिप्ट्स में पहले से उपलब्ध @ प्रकार / नोड टाइपिंग
पॉपगैस.व्जा

1
ए / प्रकार फ़ोल्डर उन पारंपरिक स्थानों में से एक है, जहां कोई बाहरी प्रकार की घोषणाएं करता है (जैसे विशिष्ट इंजन का संदर्भ जैसे कि बटलैंड इंजन या अनपेड जावास्क्रिप्ट मॉड्यूल / पैकेज, जो यहां उपयोग नहीं किए जाते हैं)
पॉपग्विसइन्जा

3

आप वास्तव में परियोजना संदर्भ का उपयोग कर सकते हैं। अपनी मूल फ़ाइलों के लिए वही परिणाम प्राप्त करने के लिए इन चरणों का पालन करें, जिनमें एक फ़ाइल में शीर्ष स्तर पर सभी फ़ंक्शन हैं। हालांकि, मुझे बॉट्स में केवल आवश्यक कार्यों को आयात करने का कोई समाधान नहीं मिला। यानी आयात और निर्यात का उपयोग किए बिना।

जड़ में अपने tsconfig.json में

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

इसके बाद, अपने lib फ़ोल्डर में, जैसे 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, movement.ts और utils.ts में कुछ समायोजन करने की आवश्यकता है ताकि 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"/>
(...)

इसके बाद, हम मूल पर j.json जोड़ते हैं (बॉट्स का 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

तो मैंने कुछ इस तरह से सोचा, लेकिन इसका कारण यह नहीं है क्योंकि आपकी शाखा पर आउटपुट प्राप्त करने वाली फ़ाइल में शीर्ष पर इस तरह का सामान है, और खेल को इसमें सभी कार्यों के साथ एक फ़ाइल की आवश्यकता है। तो मैं तो मैन्युअल रूप से सभी संकलित आउटपुट को एक साथ फाइल को बनाने के लिए तैयार करना होगा, जिसे मैं अपलोड करूंगा, बजाय फाइल को पेस्ट करने के। `" कठोर प्रयोग करें "; निर्यात .__ esModule = true; var data_1 = आवश्यकता ("../ lib / data"); var movement_1 = आवश्यकता ("../ lib / आंदोलन"); var utils_1 = आवश्यकता ("../ lib / utils"); `
एंड्रयू माओ

लेकिन यह काम करता है क्योंकि निर्माण फ़ोल्डर में संदर्भ (धन्यवाद के संदर्भ में) आउटपुट भी (निर्मित) है।
jperl

मैं अपनी टिप्पणी संपादित करने की प्रक्रिया में था - ऊपर देखें। या build/MissileKite.jsजब आप मूल रेपो का निर्माण करते हैं तो उस पर एक नज़र डालते हैं ।
एंड्रयू माओ

@AndrewMao क्षमा करें, केवल अब मैं समझता हूं कि आपके द्वारा "क्योंकि कोड को संशोधित करने की आवश्यकता है और बॉट लैंड को शीर्ष स्तर पर परिभाषित सभी कार्यों के साथ एकल फ़ाइल की आवश्यकता है"। मैंने "प्रीपेंड: ट्रू" का उपयोग करने के बारे में सोचा, लेकिन इसके लिए आउटफाइल और टीएस का उपयोग करने की आवश्यकता होती है, क्योंकि हम दूसरों पर निर्भर होने के कारण फाइलों को लिबास में संकलित नहीं होने देंगे।
जपरल

@AndrewMao मैंने वेबपैक समर्थन जोड़ा है। मैंने पोस्ट को संपादित किया और रेपो पर बदलावों को आगे बढ़ाया। मुझे बताएं कि क्या यह बेहतर है।
jperl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.