如何在运行Django collectstatic时忽略目录?
我正在用 Django 1.3、Ubuntu 11.10、gunicorn 和 Nginx 进行一个小测试项目,所有东西都在一个虚拟环境中。现在我在运行 collectstatic 命令,把我的静态文件放到 Nginx 提供服务的目录里。
为了简单起见,假设我的静态文件目录是 /home/user/static,而我的项目在 /home/user/project。
当我进入 /home/user/project 目录时,我运行:
python manage.py collectstatic --noinput
这个命令可以正确地把我安装的所有应用的静态文件复制过来。不幸的是,它也把 Django 管理后台的文件复制过来了,而我想跳过这些文件。
我查看了 collectstatic 的文档,发现有一个 -i (--ignore) 参数,可以用来忽略某些文件。我尝试了不同的命令变体,因为我不确定这个忽略模式是指我的 /home/user/static 目录,还是指原来的应用目录。
这里有一些我尝试过但没有成功的例子:
python manage.py collectstatic --noinput -i /home/user/static/admin
python manage.py collectstatic --noinput -i /home/user/static/admin/*
python manage.py collectstatic --noinput -i /home/user/static/a*
python manage.py collectstatic --noinput -i /home/alexis/.virtualenvs/django13/*
python manage.py collectstatic --noinput -i /home/user/.virtualenvs/django13/lib/python2.7/site-packages/django/contrib/admin*
我发现如果我从 /home/user/static/admin 创建一个符号链接到 /home/user/.virtualenvs/django13/lib/python2.7/site-packages/django/contrib/admin/media,collectstatic 就会注意到并跳过这些文件的复制。不过,我还是想让 --ignore 选项正常工作。
我漏掉了什么呢?
谢谢你的帮助!
3 个回答
我有一个这样的文件夹结构:
my_project
└─content
| └─static
| └─content
| ├─css
| ├─dist
| ├─js
| ├─scss
我想排除掉 scss
文件夹以及里面的所有文件。
下面是我尝试过的所有方法的记录。
以下是一些不有效的命令:
"python manage.py collectstatic --no-input --ignore /content/static/content/scss"
"python manage.py collectstatic --no-input --ignore /content/static/content/scss/"
"python manage.py collectstatic --no-input --ignore /content/static/content/scss/*"
"python manage.py collectstatic --no-input --ignore content/static/content/scss"
"python manage.py collectstatic --no-input --ignore content/static/content/scss/"
"python manage.py collectstatic --no-input --ignore content/static/content/scss/*"
"python manage.py collectstatic --no-input --ignore /content/scss"
"python manage.py collectstatic --no-input --ignore /content/scss/"
"python manage.py collectstatic --no-input --ignore /content/scss/*"
"python manage.py collectstatic --no-input --ignore content/scss"
"python manage.py collectstatic --no-input --ignore content/scss/"
以下是一些有效的命令:
"python manage.py collectstatic --no-input --ignore content/scss/*" <- best
"python manage.py collectstatic --no-input --ignore content/scss*"
理解这一点的关键是要读十遍这句话:
你需要从静态目录找到路径,而不是从项目根目录。
总结一下:
- 路径开头不需要斜杠
- 路径是相对于你的静态目录的
Django 2.2 的更新终于解决了一个很久以来的问题,那就是在路径匹配时可以指定忽略的参数。例如,
manage.py collectstatic --ignore /vendor/*.js
这样就可以正常工作了。
不要写目录的完整路径。比如说,使用方法如下:
python manage.py collectstatic --noinput -i admin
这个命令不会把 admin/ 目录复制到 STATIC_ROOT 路径下。