Eu tenho um script de instalação que instala um repositório github específico e todos os seus requisitos.
este é o trecho do instalador que parece inconsistente:
@echo off
REM Check if Python 3.11 is installed
python --version 2>&1 | findstr /I "3.11"
if %ERRORLEVEL% NEQ 0 (
echo Python 3.11 is not installed. Please install Python 3.11 from the official website.
exit /b 1
)
REM Check if Git is installed
where git > nul 2>&1
if %ERRORLEVEL% NEQ 0 (
echo Git is not installed. Installing Git...
powershell -Command "Start-Process https://git-scm.com/download/win -Wait"
)
REM Check if Node.js and npm are installed
node --version 2>&1 | findstr /I "v"
if %ERRORLEVEL% NEQ 0 (
echo Node.js is not installed. Please install Node.js with npm from the official website.
exit /b 1
)
REM Check if Python requests library is installed
pip show requests | findstr /I "Name: requests"
if %ERRORLEVEL% NEQ 0 (
echo Installing requests...
pip install requests
)
REM Set the installation directory to the user's home directory
set "repo_dir=%USERPROFILE%\algorithm-trader-warframe"
mkdir "%repo_dir%" 2>nul
cd /d "%repo_dir%"
REM Clone the Git repository into the specified directory
if exist "%repo_dir%\Warframe-Algo-Trader" (
echo Repository is already cloned in %repo_dir%\Warframe-Algo-Trader.
) else (
echo Cloning the Git repository into %repo_dir%\Warframe-Algo-Trader...
git clone https://github.com/akmayer/Warframe-Algo-Trader
)
REM Install Python dependencies
pip install -r "%repo_dir%\Warframe-Algo-Trader\requirements.txt"
pip install uvicorn
REM Set the installation directory to the 'my-app' folder
cd /d "%repo_dir%\Warframe-Algo-Trader\my-app"
REM Check if Node.js dependencies are already installed
if exist "node_modules" (
echo Node.js dependencies are already installed.
) else (
echo Installing Node.js dependencies...
npm install --no-fund
REM Wait for npm installation to complete
:WAIT_NPM_INSTALL
if not exist "node_modules" (
timeout /t 5 /nobreak > nul
goto WAIT_NPM_INSTALL
)
)
REM Go back to the main 'Warframe-Algo-Trader' folder
cd /d "%repo_dir%\Warframe-Algo-Trader"
REM Remove the existing config.json file (if it exists)
if exist "config.json" del "config.json"
REM Initialize the tables and create a new config.json file
python init.py
O problema ocorre consistentemente onde ele não continua com o python init.py e os outros scripts. uma solução consistente é executar o script duas vezes. agora tenho uma teoria que provavelmente se deve a um timing inadequado, mas, além disso, não consigo encontrar nada online ou por meio do GPT que sugira a causa do problema e sua solução.
Já tentei adicionar timeouts e loops de espera, mas não parece funcionar. O script sempre funciona na segunda vez em que é executado e eu gostaria de minimizar isso para apenas uma vez sem juntar as coisas.
Hmm.. o primeiro problema para dosadores regulares é o assunto não mencionado de que o Mingw está em operação.
O Mingw substitui a operação normal de alguns utilitários de lote padrão, portanto, precisa ser mencionado.
Acredito que isso não seja um problema aqui.
Primeira questão: a causa de "funciona na segunda vez" é normalmente que a abertura padrão de um arquivo em lote
não foi seguido. Isso descarta quaisquer alterações feitas no ambiente quando o lote terminar, de modo que as variáveis estabelecidas por um arquivo de lote não afetem nenhum outro lote que possa ser executado na mesma sessão.
A conclusão, portanto, é que uma variável de ambiente está sendo estabelecida pela primeira execução, não excluída quando a primeira execução termina e é usada na segunda execução.
Portanto - provavelmente há uma
set
instrução sendo executada na primeira execução que estabelece uma variável usada em uma etapa anterior. Isso pode serexplicit
(a variável é mencionada pelo nome no script) ouimplicit
(a variável é usada por um índice ou utilitário). Ou pode ser que um diretório seja estabelecido na primeira execução que se supõe existir em algum ponto, ou que se supõe que o diretório atual seja diferente de sua localização real.Portanto, os candidatos são
ou alguma variável estabelecida por um subscrito OU o diretório atual no início, pois parece haver
cd
instruções que não estão sendo desfeitas (setlocal
restaura o diretório original quando o batchh termina)Portanto, aconselho configurar
repo_dir
no início do script e, em seguida, criar o(s) subdiretório(s) necessário(s).O próximo problema é
it doesnt proceed with python init.py and the other scripts
. Comopython init.py
é a última linha, considero oother scripts
problema - mas não sei o que são. Talvez executá-los dependa de ter o diretório correto como atual, talvez dependente derepo_dir
.Finalmente,
não vai funcionar. A
code block
(sequência de declarações entre parênteses) não pode conter um rótulo.É mais provável que funcione