0

私の Cookiecutter プロジェクトは次のように構成されています

├── project
│   ├── {{Cookiecutter.client_name}}
│   │   ├── {{Cookiecutter.account_name}}
│   │   │   │── some-folder  
│   │   │   ├── {{Cookiecutter.account_name}}.py

cookiecutter.jsonこのように見えます

{
    "client_name": "client",
    "account_name": "account"
}

さて、代わりにaccount_name. {{Cookiecutter.client_name}}Cookiecutter がプロジェクトを生成するときに、account1、account2、account3 などの複数のフォルダーが必要になるように、複数の account_names を追加したいと考えています。

私は Cookiecutter のドキュメントを調べましたが、意味のあるものやその方法については見つかりませんでした。

4

1 に答える 1

1

私の知る限り、アカウントの数が事前に固定されていない場合、これは cookiecutter では不可能です。しかし、フックでも同じ効果を得ることができます。このようなもの:(nb未テスト)

├── project
│   ├── {{ client_name }}
│   │   ├── account_name
│   │   │   │── some-folder  
│   │   │   ├── account_name.py
|   |-- hooks
|   |   |-- post_gen_project.py
# post_gen_project.py
# runs from the *generated* project
from pathlib import Path
from shutil import copy, rmtree
accounts = [x.strip() for x in {{ accounts }}.split(",")] # cookiecutter will render this for you
client_name = {{ client_name }}
src = Path(client_name)
for account in accounts:
    copy(src / "account_name", src/account)
    fn = src/ f"account/account_name.py"
    fn.rename(fn.with_name(f"{account}.py"))
rmtree(src)

やるべきことがたくさんある場合は、デプロイ スクリプトを自分で作成し、cookiecutter を使用しない方がよい場合があります。

あなたのアカウントは,別々に入力されていると思います.Cookiecutterで生のリストタイプを取得する方法があるかどうか思い出せません.

さらに別のオプションは、ネストされたcookiecutters を使用することです。具体的にはaccount、ユーザーがアカウントを追加する必要がなくなるまで、ループ内で post_gen フックから cookiecutter を呼び出します。このようなもの(これもテストされていませんが、出発点として提供されています):

├── project
│   ├── {{ client_name }}
│   │   ├── account_template
|   |   |   |-- {{ account_name }}
│   |   │   │   │── some-folder  
│   |   │   │   ├── {{ account_name }}.py
|   |-- hooks
|   |   |-- post_gen_project.py
# cookiecutter_project.json
...
"_copy_without_render": ["account_template/"]

これにより、レンダリングせずに、必要な場所に内部の cookiecutter がデプロイされます。次に、内側の cookiecutter で:

# account_template/cookiecutter.json
{ "account_name": "default account", "client_name": "default client"}

そして最後に、外側の cookiecutter のフックで:

# hooks/post_gen_project.py
from shutil import rmtree
from cookiecutter.main import cookiecutter

client_name = {{ client_name }}
cont = True
while cont:
    account_name = input("Enter account name: ")
    cookiecutter(
                 "template_account", 
                  no_input=True,
                  extra_content=dict(
                                     account_name=account_name,
                                     client_name=client_name
                                     )
                )
    cont = not input("Press enter to continue").strip()

rmtree("template_account")

アカウントの数が事前に決まっている場合は簡単です。1 つのセットaccount1、次のセットなどに名前を付けるだけaccount2です。

参考文献:

https://cookiecutter.readthedocs.io/en/1.7.3/advanced/hooks.html https://cookiecutter.readthedocs.io/en/1.7.3/advanced/suppressing_prompts.html#suppressing-command-line-prompts

于 2021-09-28T10:33:07.950 に答える