Sulla faccia di esso, sembra che requirements.txt
e setup.py
sono duplicati stupide, ma è importante capire che mentre la forma è simile, la funzione prevista è molto diversa.
L'obiettivo di un autore di pacchetti, quando si specificano le dipendenze, è di dire "ovunque si installi questo pacchetto, questi sono gli altri pacchetti necessari, affinché questo pacchetto funzioni".
Al contrario, l'autore della distribuzione (che potrebbe essere la stessa persona in un momento diverso) ha un lavoro diverso, in quanto dicono "ecco l'elenco dei pacchetti che abbiamo raccolto e testato e che ora devo installare".
L'autore del pacchetto scrive per un'ampia varietà di scenari, perché stanno facendo del loro lavoro là fuori per essere utilizzati in modi che potrebbero non conoscere e non hanno modo di sapere quali pacchetti verranno installati insieme al loro pacchetto. Per essere un buon vicino ed evitare conflitti di versione di dipendenza con altri pacchetti, devono specificare una gamma di versioni di dipendenza quanto più ampia possibile. Questo è ciò che install_requires
in setup.py
fa.
L'autore della distribuzione scrive per un obiettivo molto diverso e molto specifico: una singola istanza di un'applicazione o servizio installata, installata su un determinato computer. Per controllare con precisione una distribuzione ed essere sicuri che i pacchetti giusti siano testati e distribuiti, l'autore della distribuzione deve specificare la versione esatta e la posizione di origine di ogni pacchetto da installare, comprese le dipendenze e le dipendenze delle dipendenze. Con questa specifica, una distribuzione può essere ripetutamente applicata a più macchine o testata su una macchina di prova e l'autore della distribuzione può essere sicuro che gli stessi pacchetti vengano distribuiti ogni volta. Questo è ciò che requirements.txt
fa.
Quindi puoi vedere che, mentre entrambi sembrano un grande elenco di pacchetti e versioni, queste due cose hanno lavori molto diversi. Ed è sicuramente facile mescolarlo e sbagliarlo! Ma il modo giusto di pensare a questo è che requirements.txt
è una "risposta" alla "domanda" posta dai requisiti in tutti i vari setup.py
file di pacchetto. Piuttosto che scriverlo a mano, viene spesso generato dicendo a pip di guardare tutti i setup.py
file in un set di pacchetti desiderati, trovare un set di pacchetti che ritiene corrisponda a tutti i requisiti e quindi, dopo l'installazione, "bloccare "quell'elenco di pacchetti in un file di testo (da qui deriva il pip freeze
nome).
Quindi il takeaway:
setup.py
dovrebbe dichiarare le versioni di dipendenza più vaghe possibili che sono ancora praticabili. Il suo compito è quello di dire con cosa può funzionare un determinato pacchetto.
requirements.txt
è un manifest di distribuzione che definisce un intero processo di installazione e non deve essere considerato come legato a un singolo pacchetto. Il suo compito è di dichiarare un elenco esaustivo di tutti i pacchetti necessari per far funzionare una distribuzione.
- Poiché queste due cose hanno contenuti e ragioni di esistenza così diversi, non è possibile semplicemente copiarne una nell'altra.
Riferimenti:
install_requires
viene utilizzato per dichiarare le dipendenze dai pacchetti richiesti per il funzionamento del pacchetto e utilizzati dallo sviluppatore del pacchetto, mentrerequirements.txt
viene utilizzato per automatizzare l'installazione di ambienti, che consente l'installazione di software aggiuntivo e l'esecuzione del pin di versione e vengono utilizzati dagli amministratori di sistema che distribuiscono il pacchetto. Il loro ruolo e il pubblico target differiscono in modo significativo, quindi cercare di combinarli come desideri di OP è un vero errore di progettazione.