gitで管理しているソースをsvnに入れる

自分の開発はgitで行っているけど、お客様のレポジトリがsvnというケースが少なからずあります(私の場合)

gitからcloneしてsvnにimportするまでの手順は、実行頻度が少なくていつもてこずるのでここにメモします。

以下の例はCakePHP3での例ですが、ignore周り以外は流用できます:

まず、gitからcloneする

cd /var/www/html
git clone https://xxxx ./app

次にsvnに登録したくないファイルを削除する

git cloneした直後なのでリポジトリ管理したくないファイルは存在しないと思ったのですが.gitの中とかは管理対象外にしたいですよね。よってこのステップを実施します。なぜ先に削除するかというと、svnに登録したファイルを後からsvn管理外にするのは面倒だからです。

cd /var/www/html/app
rm -f tmp/*
rm -f tmp/cache/models/*
rm -f tmp/cache/persistent/*
rm -f tmp/cache/views/*
rm -f tmp/sessions/*
rm -f tmp/tests/*
rm -f logs/*
rm -rf vendor/*
rm -rf ./.git
rm -rf ./.github

ローカルのソースをsvnにimportする

cd /var/www/html/app
svn import . svn://リポジトリのURL -m "initial import"

次に、ローカルのソースを退避する

不便なんですが、importしただけでは手元のソースがワーキングコピーになりません。

cd /var/www/html
mv app app_bak

リポジトリからワーキングコピーを作る

cd /var/www/html
svn co svn://リポジトリのURL ./app

ignoreを行う

gitは.gitignoreがあり、便利ですが、svnの場合はプロパティの設定でignoreします:

cd /var/www/html/app
svn propset svn:ignore "*" tmp
svn propset svn:ignore "*" tmp/cache/models
svn propset svn:ignore "*" tmp/cache/persistent
svn propset svn:ignore "*" tmp/cache/views
svn propset svn:ignore "*" logs
svn propset svn:ignore "*" vendor
svn status

ignoreした結果をコミットする

svn commit -m "apply ignore properties"

以上です

CakePHP3:composer install時にディレクトリを作成する

Composerを使ってCakePHPをインストールすると、logとかtmpディレクトリを適宜作って、かつ、パーミッションを設定してくれます。 これまでは、アプリケーション独自のディレクトリを作る場合に手動でスクリプトを叩いていたのですが、面倒かつ、抜けがでるので Composerにやらせることにしました。

やり方は簡単で、composer.jsonに次の記載をするだけです:

    "scripts": {
        "post-install-cmd": [
             "mkdir -p ./data/uploads; chmod 777 ./data/uploads",
             "App\\Console\\Installer::postInstall"
        ],

App\\Console\\Installer::postInstallは最初から入っていて、tmpやらlogやらを作ってくれます。 その上の行でdata/uploadsディレクトリを作成し、パーミッションを設定しています。

シェルスクリプト、もしくはPHPでプログラムを書いて作成に失敗した場合はエラーを出すとよりよいでしょう。

ステップイン、ステップオーバー、そしてステップアウトについて

実は恥ずかしながら、これまでjsをデバッグする際にconsole.logに出力したりalertで表示したりしていました。 本日購入した「Javascript本格入門」ではChromeデベロッパーツールを使って のデバッグ方法が書いてあったので試してみました。

Stackoverflowにわかりやすい説明があったので記載します:

ステップインは、現在の行にメソッドコールがある場合、そのメソッドの中に移動します。もし、複数のメソッドが呼ばれている場合は実行順に移動します。メソッドコールが無い場合はステップオーバーと同じです。ステップインは、インタープリターがソースを1行1行実行するのを追うのに似ています。

ステップオーバーは現在のスコープの次の行に移ります。しかしその際、メソッドコールがあった場合、メソッドを実行しますがデバッガの位置がメソッドの中に移動しません。ステップオーバーは特定のメソッドのロジックを追いたいが、中身の細かな点については興味がない場合に利用します。ステップオーバーはどの時点において期待している条件への違反が発生したかを追うのに便利です。

ステップアウトは次のreturnもしくはreturn相当まで進みます。つまり、制御が前のスタックに戻るまでです。 ステップアウトは現時点・現在のメソッドでの調査が終わり、値が利用されているスタックの元の場所に戻るのに利用します。

仮に以下のコードがあり、mainからbarが呼ばれ、 現在、関数barの1行目を実行中だとする:

function main() {
   val s = foo();
   bar(s);
}

function foo() {
   return "hi";
}

function bar(s) {
   val t = s + foo(); // デバッガにおける現在の位置
   return t;
}

ステップインを行った場合

デバッガの位置はfoo関数の1行目、つまりreturn "hi"と書いてある行に移ります。 次にステップアウトをすると、デバッガの位置はfooの呼び出し元の次の行である bar関数の2行目(return tの場所)に移ります。

ステップオーバーを行った場合

デバッガの位置はbar関数の次の行、つまりreturn tに移ります。 次にステップアウトすると、デバッガの位置はmain関数の最後の行に移ります。

stackoverflow.com

CakePHP3:カラム追加が反映されない

CakePHP3.5で、カラム追加したにも関わらずそのカラムのデータがINSERT/UPDATEされない現象に出くわしました。 tmp以下をクリアしても解消しない…

対策ですが、Entityの編集が必要でした:

    protected $_accessible = [
        'id' => false,
        <中略>
        '新しいカラム' => true

(*ですべてのカラムをtrueにしている場合は対策が不要です)