LoginSignup
2
1

More than 5 years have passed since last update.

リモートでビルド【Win→Linux】【HotReloadもどき】【VSCode】

Last updated at Posted at 2019-04-16

記事のターゲット

  • WindowsでLinux用のプログラムを作る。
  • 最終的にはLinux側でビルドしなくてはならないため、出来ればLinux上でビルドをしながら開発したい。
  • デバッグはプリント文いれて何とかする。
  • VSCodeで開発したい。

最終目標

以下のGif画像のようなになればOK!
ezgif.com-gif-maker (2).gif

手順

  1. VSCodeをDL・インストールする。
  2. Remote Workspaceというプラグインを入れる(リモート先をワークスペースに出来る)。
  3. HotReloadっぽいことをやるために、ソースファイルを監視させるプロセスを作る。※ソースの変更を感知したら、make && ./helloを実行してもらう。※ファイル監視 → 変更を感知 → ビルド
  4. ファイル監視プロセスを起動しながら、ソースを変更していく。

1. VSCodeをDL・インストールする

2. Remote Workspaceというプラグインを入れる

Remoto Wrokspaceを入れたら

remote.code-workspace
{
  "folders": [
    {
      "uri": "sftp://user:pass@localhost:2222/home/",
      "name": "Test"
    }
  ]
}

.XXX.code-workspaceを作る。その後VSCode上部のファイル>ワークスペースを開くから選択をすると、リモート先のディレクトリが見れるようになる(権限があれば編集も可能)

↓この方が詳しくまとめてくれています。
https://qiita.com/jerrywdlee/items/b239958d3df04364875d

3. HotReloadっぽいことをやるために…

ファイル監視 → 変更を感知 → ビルド

上記を実現するために、今回はPythonのwatchdogを用いた。以下、ソース

dir_watch.py
# -*- coding: utf-8 -*-

from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer

import os
import time
import sys
import subprocess
import hashlib

hashes = {}
target_dir = ""
cmd = ""

class ChangeHandler(FileSystemEventHandler):
    def on_modified(self, event):
        filepath = event.src_path
        filename = os.path.basename(filepath)
        with open(filepath, 'rb') as f:
            checksum = hashlib.md5(f.read()).hexdigest()
        if filename not in hashes or (hashes[filename] != checksum):
            # コマンド実行
            subprocess.Popen(cmd, shell=True)
        else:
            # ハッシュが既存のものと変更していない
            pass

if __name__ in '__main__':
    args = sys.argv
    target_dir = args[1]
    cmd = args[2]
    while 1:
        event_handler = ChangeHandler()
        observer = Observer()
        observer.schedule(event_handler, target_dir, recursive=True)
        observer.start()
        print("Start!")
        try:
            while True:
                time.sleep(0.1)
        except KeyboardInterrupt:
            observer.stop()
        observer.join()
dir_watch.sh
ARG1="./src"
ARG2="
make && 
echo ++++++++++++++ && 
./bat/hello && 
echo ++++++++++++++"

python3 dir_watch.py $ARG1 "$ARG2"
# ./dist/dir_watch $ARG1 "$ARG2"

引数1で渡されたPathの./src下を監視して、ファイルに変更があれば、引数2で渡されたコマンドを実行している。
また、pyinstallerを使うと、ワンバイナリに出来るため、Pythonが入っていない環境でも、HotReloadもどきの事が出来るようになる。
※監視対象とするPathに実行ファイルを生成しようとすると、大変なことになる!!!なので、実行ファイルを生成する場所は別ディレクトリにする。

pyinstaller dir_watch.py --onefile

4. ファイル監視プロセスを起動しながら…

VSCodeのターミナルから、sshでリモート先に入り、3.で作成したプログラムを実行する。
その状態でソースの変更&保存をすると、HotReloadもどきの動きをしてくれる。

参考URL

https://qiita.com/jerrywdlee/items/b239958d3df04364875d
https://qiita.com/hirohiro77/items/466e411fa41f144c8b2a
https://python-minutes.blogspot.com/2017/06/python.html
http://ur0.work/ahCv

2
1
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
2
1