Birden çok düz JavaScript çıktı dosyası oluşturmak için ortak bağımlılıkları olan bir TypeScript projesini yapılandırma


10

Şu anda Bot Land için bazı senaryolar yazıyorum . Bot Land, birimlerinizi bir fare ve klavye ile kontrol etmek yerine, bir API aracılığıyla botlarınızı kontrol etmek için kod yazdığınız ve daha sonra botlarınızın başkalarının botlarıyla savaştığı gerçek zamanlı bir strateji oyunudur. SC2'deki birimlere aşina iseniz, yanıp sönen stalklara, kuşatma tanklarına, sağlık görevlilerine ve ultralisklere benzer botlar oluşturabilirsiniz. (Yazılım mühendisleri için oldukça eğlenceli bir oyundur, ancak bu sorunun kapsamı dışındadır.)

Bot ülkesi

Bot kontrolünün artan üç karmaşıklık seviyesi vardır: varsayılan bir AI, Scratch benzeri bir programlama dili ve BotLandScript adı verilen azaltılmış bir JavaScript seti. BotLandScript için yerleşik düzenleyici makul olsa da, tüm kodunuzu her yerde küresel üst düzey işlevlerle tek bir dosya olarak yüklemeniz gerekir . Doğal olarak, kodunuz uzamaya başlarsa ve farklı botlar aynı işlevleri paylaşırsa, bu bir süre sonra acı vermeye başlar.

programlama ortamı

Birden çok bot için kod yazmayı kolaylaştırmak, çıplak JS'de kodlarken kasıtsız hata olasılığını azaltmak ve diğer oyuncuları yenme şansımı artırmak için, her bir botum için ortak bir kütüphane ve kod sağlamak üzere yukarıdaki TypeScript projesini ayarladım . Geçerli dizin yapısı yaklaşık olarak aşağıdaki gibi görünür:

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

lib, botlar arasında paylaşılan ortak koddur ve (TS dışı) Bot Land API'sı için TypeScript tanımları sağlar. Daha sonra her bot kendi klasörünü alır, bir dosya bot kodunu ve diğeri bir kazan plakasını içerir tsconfig.json:

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

Her biri tsconfig.jsonoluşturulduğunda bot.js, tüm kodun yanı sıra botun kendisinden aktarılan kodu içeren bir karşılık gelir common.js. Bu kurulum, birkaç nedenden ötürü yetersizdir: çok sayıda yinelenen kazan plakası gerektirir, yeni botlar eklemeyi zorlaştırır, her bot için çok fazla gereksiz kod içerir ve her botun ayrı ayrı inşa edilmesini gerektirir.

Ancak, şu ana kadar yaptığım araştırmaya dayanarak, istediğimi yapmanın kolay bir yolu yok gibi görünüyor. Özellikle, yeni tsc -bseçeneğin ve referansların kullanılması işe yaramaz, çünkü bu kodun modüle edilmesini gerektirir ve Bot Land en üst düzeyde tanımlanmış tüm işlevlere sahip tek bir dosya gerektirir.

Aşağıdakilerden mümkün olduğunca fazlasını elde etmenin en iyi yolu nedir?

  • Yeni bir bot eklemek için yeni bir plaka gerekmez (örn. tsconfig.jsonBot başına no )
  • importKullanılmayan kodların çıkışını önlemek için yaygın işlevler için kullanın , ancak ...
  • Hala tüm işlevleri Bot Land'in özel biçiminde tek bir dosya olarak çıktılar
  • Her bot için bir tane olmak üzere birden fazla çıktı dosyası üreten tek bir oluşturma adımı
  • Bonus: Derleme sürecini VS Kodu ile entegre etme. tasks.jsonHer bir alt projenin inşası için halihazırda ilgili bir kazan plakası bulunmaktadır.

Cevabın muhtemelen Grunt gibi bir şey içerdiğini tahmin ediyorum tsc, ancak emin olmak için yeterince bilmiyorum.


Tüm botların ayrı klasörleri olması gerekir mi? Yoksa her bot tek bir dosyada kök seviyesinde olmalı mı? (örn. <root>/MissileKite.ts)
a1300

1
Aktarılan tüm bot dosyaları adlandırılmalıdır bot.jsmı?
a1300

Tek bir dosyada kök tercih edilir; ayrı nedeniyle ayrı klasörlerde tsconfig.json. Aktarılan bot dosyaları herhangi bir adla adlandırılabilir, tercihen orijinal dosyanın .js sürümü. Ben şimdi çıkış repo bu şekilde kurmak var build/MissileKite.js.
Andrew Mao

1
@ andrew-mao GAS projeleri için gereksinimlerinizin çoğuna hitap eden (ancak farklı bir ortamı hedefleyen) bir şablonuma bakabilirsiniz. Size yakışırsa, gelecek hafta sizin için uyarlayabilirim. github.com/PopGoesTheWza/ts-gas-project-starter
PopGoesTheWza

tsconfig-gas.jsonorada bakmak için ilgili bir şey?
Andrew Mao

Yanıtlar:


2

Gereksinimlerinize cevap verme girişimim burada .

Dikkate değer dosyalar:

  • src/tsconfig-botland.jsonherhangi bir bot.land betiğinin ayarlarını taşır (taşındığım özel bildirimleriniz dahil types/bot-land/index.d.ts). strictKullandığım ayarları değiştirmek için kullanabilirsiniz .
  • src/tsconfig.jsontüm botlarınıza referanslar içerir. Bu, başka bir bot komut dosyası eklemek istediğinizde düzenlenecek dosyadır

Bir bot komut dosyası en az iki dosyadır: minimalist tsconfig.jsonve bir veya daha fazla .tskomut dosyası.

Örneğin src/AggroMiner/tsconfig.json:

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

Çoğu durumda, yeni bir bot komut dosyası başlatmak için:

  1. herhangi bir bot klasörünü (yani src/AggroMiner) yeni bir klasöre kopyalasrc
  2. düzenlemek src/<newBotFolder>/tsconfig.jsondüzenlemek için outFilesizin bot adıyla
  3. src/tsconfig.jsonbir referansı düzenleme ve eklemesrc/<newBotFolder>

Aşağıdaki npm/ yarnkomut dosyası ayarlandı:

  • build tüm botları inşa etmek
  • build-cleanhangi buildklasörü çalıştırmadan önce temizlerbuild
  • format.tsaltında tüm dosyalarda Prettier çalıştırmaksrc
  • lint bot betiklerinde tslint kontrolü yapmak

Şimdi gereksinimleriniz azalıyor:

  • Yeni bir bot eklemek için yeni bir kaynak plakası gerekmez (örneğin bot başına tsconfig.json yok)

Bunu başarmak için bot klasörünüzü / komut dosyalarınızı numaralandıracak ve bot tsconfig.jsonve run başına ilgili bazı komut dosyaları oluşturmanız gerekir tsc. Kesinlikle gerekli olmadıkça, minimal bir kurulum (yukarıda açıklayın) yeterli olabilir.

  • Kullanılmayan kod çıktısını önlemek için ortak işlevler için içe aktarma işlevini kullanın, ancak ...

İlk olarak, herhangi bir modül export/ importdeyim kullanmaya başlarsanız, tek bir dosya çıktısı elde etmek için paket / treehake paketlemek için ek 3. tarafa ihtiyacınız olacağını unutmayın. Bot.land'dan toplayabildiğim kadarıyla, komut dosyalarınız sunucuda çalışıyor. Deadcode, bot performansınız üzerinde bir etkisi olmadıkça, gerçekten rahatsız etmem.

  • Hala tüm işlevleri Bot Land'in özel biçiminde tek bir dosya olarak çıktılar

Bitti.

  • Her bot için bir tane olmak üzere birden fazla çıktı dosyası üreten tek bir oluşturma adımı

Bitti.

  • Bonus: Derleme sürecini VS Kodu ile entegre etme. Her bir alt projeyi oluşturmak için şu anda ilgili bir kazan plakası görevleri vardır. Json.

npmKomut VSC görevleri listesinde görünmelidir böylece yapım (en azından onlar madende yapmak) tasks.jsongereksiz.


Deadcode, burada yaptığınız her şey için iyi bir uzlaşmadır; neden types/bot-landtanımları kullandığınızı ve neden strictayarları seçtiğinizi söyleyebilir misiniz ?
Andrew Mao

Türleri / bot-land / index.d.ts gerçekten lib'den orijinal .d.ts, yeniden adlandırılmış ve farklı yerleştirilmiş. Sort tüm betikler için genel bot.land yürütme bağlamı açıklamak bir çeşit varsayalım ve böylece her bot betiği her zaman kullanılabilir olduğundan emin olun. 'Sıkı' ayarlar sadece burada çünkü favori ayarlarımı tembel olarak kopyaladım (daha güzel ayarlar için aynı). Bunlar kullanıcının tercihine göre uyarlanmalıdır.
PopGoesTheWza

Bunu koymak için geleneksel bir neden typesolup olmadığını veya seçtiğiniz sadece organize etmenin belirli bir yolu olup olmadığını merak ediyorum.
Andrew Mao

Bunun tek nedeni bot.land bağlamı olduğunu varsaymaktır. Düğüm komut dosyalarınızda @ türler / düğüm yazımlarının zaten mevcut olduğunu düşünün
PopGoesTheWza

1
A / types klasörü, harici tip bildirimleri (burada kullanılmayan botland motoru veya türlenmemiş JavaScript modülleri / paketleri gibi belirli yürütme bağlamları) koyduğu geleneksel yerlerden biridir
PopGoesTheWza

3

Aslında proje referanslarını kullanabilirsiniz. Tüm işlevler tek bir dosyada en üst düzeyde olacak şekilde orijinal dosyalarınızla aynı sonuçları almak için bu adımları izleyin. Ancak, botlarda yalnızca gerekli işlevleri almak için bir çözüm bulamadım. Yani, ithalat ve ihracat kullanmadan.

Kökündeki tsconfig.json dosyasında

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

Daha sonra, lib klasörünüze tsconfig.json ekleyin

{
  "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, move.ts ve utils.ts dosyalarında birkaç ayar yapmamız gerekiyor, böylece ts derleme hatalarıyla bizi rahatsız etmiyor.

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"/>
(...)

Daha sonra, base.json'u köke ekleriz (botların tsconfig.json'u onu genişletir).

base.json

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

ve botların tsconfig.json (botlara göre uyarlayın)

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

Bu kadar. Şimdi sadece koş

tsc -b

Bu yüzden böyle bir şey düşündüm, ancak çalışmamasının nedeni, dalınızda çıktı alan dosyanın üstte böyle bir sürü şey olması ve oyunun tüm işlevlere sahip bir dosyaya ihtiyaç duymasıdır. Bu yüzden, sadece dosyayı yapıştırarak kopyalamak yerine, yükleyeceğim dosyayı oluşturmak için tüm derlenmiş çıktıları el ile Arnavut kaldırması gerekir. `` katı kullanın "; export .__ esModule = doğru; var data_1 = zorunlu ("../ lib / data"); var Hareket_1 = zorunlu ("../ lib / hareket"); var utils_1 = requir ("../ lib / utils"); ``
Andrew Mao

Ancak, lib de build klasöründe (referanslar sayesinde) çıktısı (oluşturulduğu) için çalışır.
20'de jperl

Yorumumu düzenleme sürecindeydim - yukarıya bakın. Veya build/MissileKite.jsorijinal repoyu oluştururken çıktıya bir göz atın .
Andrew Mao

@AndrewMao özür dilerim, sadece şimdi ne demek istediğini anlıyorum "çünkü bu kodun modüle edilmesini gerektirir ve Bot Land en üst düzeyde tanımlanan tüm fonksiyonlara sahip tek bir dosya gerektirir." Ben "prepend: true" kullanarak düşündüm ama outFile ve ts kullanarak gerektirir bize bazı diğerlerine bağımlı olduğundan lib dosyaları derlemek izin vermez.
jperl

@AndrewMao Webpack desteği ekledim. Gönderiyi düzenledim ve değişiklikleri depoya ittim. Daha iyi olup olmadığını bana bildirin.
jperl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.