# Juliaパッケージ作成法; BasicBSpline.jlのメモ
###### tags: `Julia`
## 概要
* 基本的にインターネットからの寄せ集めの情報です
* 参考文献は末尾にまとめて記載する.
* 私の個人的なメモも兼ねてます.
* インターネットには古い情報もあるので、迷わないようにまとめることにも一定の価値がある(はず)
## やったこと
* `BasicBSpline.jl`というパッケージの生成
* 私の独自記法に合わせたBスプライン関連のパッケージ
* https://github.com/hyrodium/BasicBSpline.jl
## つかいかた
* GitHubからインストールできます
```
(pkg) > add https://github.com/hyrodium/BasicBSpline.jl
```
## 環境
JuliaはWindowsを含めた色々な環境に対応しているので, 今回のパッケージの動作に影響する訳ではない.
しかし, パスの表記などが異なる場合があるので念のため記載しておく:
* Manjaro Linux
### 事前準備
* PkgTemplatesのインストール
* Juliaのパッケージモードで`add PkgTemplates`する
* sshキーを生成してGitHubに登録
* 以下の記事を参考にやれば良い.
* https://qiita.com/shizuma/items/2b2f873a0034839e47ce
* https://help.github.com/ja/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account
* (sshキーの登録は何度もやってるが毎回やり方を忘れてしまう)
### パッケージ雛形の生成
これを実行した.
```
using PkgTemplates
t = Template(;
ssh=true,
user="hyrodium",
plugins=[
TravisCI(),
GitHubPages(),
]
,
)
generate("BasicBSpline", t)
```
REPLでチマチマ入力するのは面倒なのでJunoかJupyterでやれば良い.
### `src`の編集
前の工程で`~/.julia/dev/BasicBSpline`以下にパッケージのテンプレートが生成されているはず.
`src/BasicBSpline.jl`を編集すればおk.
### `test`の編集
(順番としては後でやったが, 説明の都合上ここで書く)
`test/runtests.jl`を編集すればおk.
```
using BasicBSpline
using IntervalSets
using Test
@testset "BasicBSpline.jl" begin
# Write your own tests here.
@testset "Knots" begin
@test zero(Knots)==Knots([])
@test Knots(1:3)==Knots([3,2,1])
@test Knots([-1,2,3])+2Knots([2,5])==Knots([-1,2,2,2,3,5,5])
@test Knots([-1,2,3])+2Knots([2,5])==Knots([-1,2,2,2,3,5,5])
end
@testset "BSplineSpace" begin
P = BSplineSpace(2,Knots([1,3,5,6,8,9]))
@test BSplineSupport(2,P)==3..8
@test dim(P)==3
end
end
```
上記のように`testset`が入れ子になっててもおk.
### パッケージ依存関係の追加
* `~/.julia/dev/BasicBSpline`に移動してからJulia起動
* pkgモードで`activate .`する
* `add IntervalSets`する
### documentの生成
* `~/.julia/dev/BasicBSpline/docs`に移動
* 以下を実行
```
julia --project=docs -e '
using Pkg;
Pkg.develop(PackageSpec(path=pwd()));
Pkg.instantiate();
include("docs/make.jl");
'
```
* `docs/build/`に移動
* `python3 -m http.server --bind localhost`を実行
* `http://localhost:8000/`にアクセスして確認
### リポジトリにpush
* `Initialize with README.md`**せずに**リポジトリを作成
* `~/.julia/dev/BasicBSpline.jl`に移動
* `git push -u origin master`する
### デプロイキーの作成
* 以下のコードを(どこでも良い?)実行する.
```julia
using DocumenterTools
# Travis.genkeys(user="hyrodium", repo="git@github.com:hyrodium/BasicBSpline.jl.git") こちらはdeprecated
DocumenterTools.genkeys(user="hyrodium", repo="git@github.com:hyrodium/BasicBSpline.jl.git")
```
* 2種類の文字列が出てくるので前者をDeploy keyとしてGitHubに登録する.
* https://github.com/hyrodium/BasicBSpline.jl/settings/keys/new
* 名前は適当に`TravisDocumenter`とかでおk
* Allow write accessにチェックを入れる
* TravisCIにログイン
* https://travis-ci.org/account/repositories
* ここでリポジトリを選択
* https://travis-ci.org/github/hyrodium/BasicBSpline.jl/settings
* ここで後者の長い文字列を追加
* これで設定完了
### Gitのタグ付け
* https://github.com/hyrodium/BasicBSpline.jl/releases
* Create a new releaseする
* `v0.1.0`とかをタグに設定
### GitHubからcloneして編集
```
(pkg) > dev https://github.com/hyrodium/BasicBSpline.jl
```
(たぶんこれでおk)
### ドキュメントの追加編集
PkgTemplates.jlで生成した雛形では`docs/src/index.md`は以下のようになっている.
````markdown
# BasicBSpline.jl
```@index
```
```@autodocs
Modules = [BasicBSpline]
```
````
これを編集する.
juliaの方言がかなり入ったmarkdownなので慣れるまで少し掛かりそう.
この辺りの処理をしているパッケージは[Documenter.jl](https://github.com/JuliaDocs/Documenter.jl)である.
## 参考資料
* [PkgTemplates による Julia パッケージの作り方(前半)](https://qiita.com/SatoshiTerasaki/items/24443f20852ed60968bf)
* 主な参考資料はこちら
* [PkgTemplates による Julia パッケージの作り方(後半)](https://qiita.com/SatoshiTerasaki/items/f43a7730bcf57f4b9572)
* 主な参考資料はこちら
* [Juliaのパッケージ開発に便利なPkgTemplate, Revise, developコマンド](https://qiita.com/mametank/items/43330a9452f0039ca22d)
* [Julia Pkg modeの操作](https://qiita.com/skiing_LAL10/items/0c0132a34629fbc8a91f)