visual studio code - VSCode'da Özel Bir TypeScript dil hizmeti eklentisi geliştirme
VSCode'da bir TSserver eklentisi geliştirmeye çalışıyorum ama sunucunun eklentimi yüklemesini sağlayamıyorum
tsconfig.json'da yolu yerel bir yol ve node_modules yoluna ayarlamayı denedim
Bence bu, eklentiyi çalıştırması gereken çok minimalist bir proje https://github.com/Spensaur-K/minimal-tsserver-plugin
Sunucu plugini yüklemiyor. Plugine mesaj kaydetmiyor veya plugin içine bir hata koyarsam çöküyor.
Cevap #1
TS Sunucusunda özel bir eklentiyi bir dosyadan sunulurken yükleyebilmemi sağlayan tek yol:
- Yerel TypeScript kullanarak çalışma alanı yapılandırmasını etkinleştir:
npm i typescriptpackage.json:
{
"dependencies": {
"typescript": "^4.2.3"
}
}
.vscode/settings.json{
"typescript.tsdk": "./node_modules/typescript/lib",
// ~/.config/Code/logs/**/tsserver.log
"typescript.tsserver.log": "verbose",
"typescript.enablePromptUseWorkspaceTsdk": true
}
Yerel TypeScript kullanmak önemlidir, çünkü TypeScript, TS Sunucusunun çalışma dizininde ve yukarısında node_modules içindeki paket adıyla eklentiyi arayacaktır. Küresel TypeScript kullanılmaya çalışılırsa (/usr/local/lib/node_modules/typescript/lib), tsserverın çalışma dizini o civarda olacak ve eklentiniz bu yolun yakınında olmayacaktır.
Verbose kullanmak isteğe bağlı görünüyor, çünkü TS Server'daki eklenti yükleme ile ilgili tüm mesajlar bilgi düzeyinde gibi görünüyor, ama hiçbir şeyi kaçırmadığımdan emin olmak için bunu etkinleştirdim, çünkü bunu hata ayıklamak zaten yeterince yapmacık: günlüklere bakmak için, bir TS/JS dosyasında iken Cmd+Shift+P tuşlarına basın ve TypeScript: Açık TS Sunucu Günlüğünü Göster'i seçin.
İş yeri TypeScript sürümü için istemi etkinleştirmek de isteğe bağlıdır, aksi takdirde bir TS/JS dosyasında Cmd+Shift+P tuşlarına basıp TypeScript: TypeScript Sürümünü Seç seçeneğini seçerek ve bunu .vscode/settings.json dosyasında yapılandırılmış iş yeri sürümüne değiştirerek manuel olarak yapmanız gerektiğini unutmanızı önlemeye yardımcı olur.
- Proje dizininizde
node_modules/pluginiçinde eklentinizi oluşturun
Burası optimal olmayan kısım, eklentiye ait kaynak kodunun node_modules içinde olmasından nefret ediyorum, ama onu taşımak için bir yol bulamadım, çünkü TS Server'ın çalışma dizini artık proje dizininizin node_modules içinde ve bir üst dizin proje dizininizin üstündeki node_directory, ve böyle devam ediyor. Eklenti kodunuzun bu zincirde olmasına gerek kalmayacak şekilde nasıl yapabileceğimi bilmiyorum.
node_modules/plugin/package.json:
{
"name": "plugin"
}
node_modules/plugin/index.js:
module.exports = function init(modules) {
function create(info) {
const service = info.languageService;
info.project.projectService.logger.info(
"Started custom plugin"
);
return service;
}
return { create };
}
Eklentiyi doğrudan TypeScript ile yazmanın, transpile etmeden mümkün olduğunu düşünmüyorum.
- TS Sunucusunu eklentinizi kullanacak şekilde yapılandırın ve yeniden başlatın
tsconfig.json:
{
"compilerOptions": {
"plugins": [
{
"name": "plugin"
}
]
}
}
İsim bir dosya yolu olamaz (https://github.com/microsoft/TypeScript/issues/18623), bu yüzden burada eklentiyi bir Node paket ismiyle referans ediyoruz ve bu nedenle eklenti kaynak kodunu TS Sunucu çalışma dizinine giden node_modules zinciri içinde yerleştirme ile ilgili tüm hileler ortaya çıkıyor.
TS Sunucusunu yeniden başlatmak için bir TS/JS dosyasına gidin ve Cmd+Shift+P tuşlarına basın ve TypeScript: Restart TS Server seçeneğini seçin. Sonra tekrar Cmd+Shift+P tuşlarına basın ve TypeScript: Open TS Server Log seçeneğini seçin.
O zaman şöyle bir şey görmelisiniz (… proje dizininizi temsil eder):
Info 24 [09:59:19.919] Enabling plugin plugin from candidate paths: /…/node_modules/typescript/lib/tsserver.js/../../..,/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/typescript-language-features
Info 25 [09:59:19.919] Loading plugin from /…/node_modules/typescript/lib/tsserver.js/../../.. (resolved to /…/node_modules/node_modules)
Info 26 [09:59:19.923] Started custom plugin
Info 27 [09:59:19.923] Plugin validation succeded
Eğer biri, eklentiyi node_modules dizininden değil de proje dizininizden doğrudan yüklemenin nasıl yapıldığını ya da yerel bir kurulum yerine global TypeScript kurulumunun nasıl kullanılacağını biliyorsa, sözü sizde!
Düzenle :
Yapılabilecek bir iyileştirme, node_modules/plugin/index.js dosyasını şu şekilde değiştirmektir:
module.exports = require('../../plugin.js');
Ve önceden orada olan kodu proje dizininizdeki plugin.js dosyasına taşıyın. Tüm bunları proje dizinimde herhangi bir node_modules dizini olmadan yapmanın bir yolu olmasını tercih ederdim, ama ne yazık ki.
Bunun için bir TypeScript hata raporu açtım: https://github.com/microsoft/TypeScript/issues/43124
Cevap #2
node_modules altındaki TS Server eklentileri yalnızca typescript'in bir çalışma alanı sürümünü kullanıyorsanız ve eklenti projeniz için tsconfig.json içinde listelenmişse yüklenir. Eklenti için göreli bir yol kullanmak da işe yaramayabilir.
Örneği çalıştırmak için:
node_modulesaltındaminimal-tsserver-pluginyükleyin- Typescript'in çalışma alanı sürümünü kullanın
tsconfig dosyanızda şunları bulundurun:
{ "compilerOptions": { "plugins": [ { "name": "minimal-tsserver-plugin" } ] } }
