🔦

[Django Tips]startprojectをした時にカレントディレクトリ下に無駄にディレクトリが作られることを防ぐ

2020/12/24に公開

はじめに

Djangoでstartprojectをした時にカレントディレクトリ下に無駄にディレクトリが作られてしまう。。。ということないでしょうか。

私はよくDjangoで新しいアプリを作り始める時に、まずディレクトリを作ってそこに移動してから、startprojectします。

# Desktop上にmysiteディレクトリを作成し、その中でプロジェクトを開始している
$ cd ~/Desktop
$ mkdir mysite 
$ cd mysite
$ django-adimin startproject mysite

しかし、こうしたやり方でプロジェクトをスタートするとこのように無駄にディレクトリが作られてしまうことになります。

# mysiteディレクトリの中に無駄にまたmysiteが出来てしまっている
mysite/
└── mysite
    ├── mysite
    │   ├── __init__.py
    │   ├── asgi.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── manage.py

そもそもなぜこんなことが起こるのでしょうか。またどうすればこのような無駄なことを避けられるのでしょうか。

何はともあれ公式を読んでみた

Djangoのstartprojectの公式ページを読んでみます。
下記の英文ドキュメントを僕の方で意訳してみました。
Django/startproject


django-admin startproject name [directory]
(このコマンドは)カレントディレトリもしくは指定された場所の中で、与えられたプロジェクトネーム向けにプロジェクトのディレクトリ構造を作ります。
デフォルトで、新しいディレクトリはmanage.pyと(setting.pyやその他のファイルを含む)プロジェクトのパッケージを内包しています。
もしプロジェクトネーム(例えばmysiteというプロジェクトネームとする)のみが与えられると、プロジェクトのディレクトリとプロジェクトのパッケージの両方がプロジェクトネームと同じmysiteと名付けられ、プロジェクトディレクトリはカレントワーキングディレクトリに作られるでしょう。
もし保存場所の指定が行われたなら、Djangoはプロジェクトのディレクトリとして存在しているディレクトリを使うでしょう。そしてその中にmanage.pyとプロジェクトパッケージを作ります。ドットを使うと現在のワーキングディレクトリを示します。


僕の和訳の稚拙さもあいまって何を言っとるんじゃという話なので少し補足をします。

まず、django-admin startproject name [directory]でnameでプロジェクト名、directoryでプロジェクトを始める場所を指定してディレクトリ構造を作ってくれます。

ディレクトリ構造というのは、要はコードツリーの中で示したmanage.pyとmysiteディレクトリのことです。mysiteディレクトリというのがプロジェクトパッケージというやつです。

さて、ここで保存先の[directory]を指定してしないとどうなるのかも公式は丁寧に教えてくれています。
カレントワーキングディレクトリ(自分が今いるディレクトリのことですね)にプロジェクトディレクトリが作られた上でその中にmanage.pyとプロジェクトパッケージが作られます。ここで意図せず無駄なディレクトリが出来ていたわけです。

解決策

解決策は単純で、以下の2つのうちいずれかをとれば良いです。

  • 最初からディレクトリを作ってその中でstartprojectする、ということを辞める
  • django-admin startproject name . のようにドットでカレントディレクトリに作りますよーと宣言する

本日は以上です。

環境

MacOS
Python 3.7.5
Django 3.0.3

GitHubで編集を提案

Discussion