0
0

More than 3 years have passed since last update.

xtextによるvscodeのエクステンションを複製するGradleタスクを書いてみた

Last updated at Posted at 2020-12-23

概要

この記事でビルドしたVSCode向けエクステンションは、拡張子がmydslのファイルを開いた場合に機能するように実装されています。同僚や仲間内へ開発したエクステンションの配布を考えている、のであれば独自の拡張子に対応しておきたいですよね。
そこで、自身のGradleの習得を兼ねつつ、基本は複製とリネームを使って実現してみました。
これが誰かのお役に立てば幸いです。

開発環境

  • Windows10 Pro 1909
  • VSCode 1.47
  • JDK 1.8
  • Tortoise Git 2.9.0.0

成果物

ソースコードをGitHubに置きました。
フォルダ構造の第1階層は以下のようになっています。

build.gradle
gradle/
gradle.properties
gradlew
gradlew.bat
LICENSE.txt
README.md
xtext-languageserver-example

使い方

とにかく使ってみたい方は

  1. GitHubからcloneを行う
  2. コマンドラインウィンドウを開き、cd等でcloneしたディレクトリへ移動
  3. gradlew duplicateXtextVscodeを実行
  4. cd xtext-languageserver-example-duplicatedを実行
  5. gradlew startCodeを実行
  6. DEMOフォルダのファイルa.mydslの拡張子をa.dupに変更する image.png シンタックスハイライトでHelloに色が付けば、拡張子dupのファイルに対応したExtensionができたことが確認できます。

拡張子を変えたい?

拡張子がdup固定のままだとオリジナルとは言えませんよね。
拡張子は、

  1. gradle.propertiesに定義してある、ext=dupdupの部分を変える
    なお、空文字列程度のエラーチェックです。Windowsが受け入れ可能な入力内容としてください
  2. gradlew duplicateXtextVscodeを実行
  3. cd xtext-languageserver-example-duplicatedを実行
  4. gradlew startCodeを実行

の手順で変えることができます。

複製先のフォルダ名を変えたい?

あまり使わないかと思うものの、複製先フォルダを指定可能にしています。

  1. gradle.propertiesに定義してある、to=xtext-languageserver-example-duplicatedxtext-languageserver-example-duplicatedの部分を変える
    こちらも、空文字列程度のエラーチェックです。..などを含めた場合などは未確認です
  2. gradlew duplicateXtextVscodeを実行
  3. cd xtext-languageserver-example-duplicatedを実行
  4. gradlew startCodeを実行

の手順で変えることができます。

終わりに

これで多数のオレオレ言語を簡単に作ってかつvscode上で使ってもらう環境が整いつつあるんじゃないかと、密かに思っていたりします。
残すは、エクステンション導入にvscode上に現れる画面のカスタマイズ。具体的には、

  • エクステンション名
  • 説明となるREADME.md
  • プロジェクト名 末尾だけでもいいかも
  • 団体名
  • エクステンションの画像

などを定義すれば見た目は元のエクステンションと同じには見えないものになるのですが、ボリュームがあるので、次のネタとして取り組みたいと思っています。

補足

簡単ですけど、本文中で述べたことの詳細や技術に関して、触れておこうと思います。

Gradleタスク定義

コマンドラインから指定していないタスクで、かつ、そのタスク内のコードが勝手に実行する、というGradleの動作が書いたコードから理解できませんでしたが、こちらに書いてあるとおり、

  • 初期化
  • 設定時
  • 実行時

の設定時に実行されていたのですね。
フォルダやファイルの有無といったタスク開始時に前提となるチェック処理は設定時に書いておく、が定石でしょうか?書き分ける基準までは検索で見つけられませんでしたが、設定時でないと困る場面はそう多くないと思うので、タスク内の処理はdoFirstまたはdoLastブロック内にのみ書くこととする、といった設計基準を設けても良いかもしれません。
なお、GitHubに置いたコードには未反映です…。

Gradleでファイルコピー

ファイルやフォルダをコピーする例を検索すると、コピータスクを使う例がたくさん出てくるものの、隠し属性のファイルやフォルダがコピーされないことに気づきました。こちらを参考に、org.apache.tools.ant.DirectoryScannerを使って実現することにしました。
なお、excludeでコピー対象に含めたくないファイルやフォルダを指定できるので、.gitフォルダは除く設定としています。

Gradleタスクでのエラー処理

こちらを参考にしました。
ロールバック等が不要な簡単なタスクなので、エラーの場合は例外をスローして中断、でいいと思っています。

作ったbuild.gradle

上記のようにつまづきながらもどうにか実現できたものの、時間をかけすぎないことを念頭に置いていたので、作ったbuild.gradleはかなり泥臭い感じとなっています。Gradleの習得にはまだまだ時間がかかりそうです。次に取り組むときは、もっと効率的かつ可読性にも考慮した書き方を目指したいものです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0