es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La variable Makefile estará vacía.

Estoy escribiendo un Makefile en Ubuntu 20.04. Cuando escribo el objetivo “up” en el primer código adjunto en el Makefile y lo ejecuto, el RESTAPIID está vacío como se muestra en la segunda imagen adjunta. Si el comando en la función shell se ejecuta directamente en la terminal sin usar make, se puede obtener el valor deseado como se muestra en el código adjunto 2.

No puedo encontrar ningún error en este Makefile. Necesito ayuda de alguien que sepa cómo resolverlo.

up:down
    ---docker-compose up -d
    ---sleep 5
    ---"$(MAKE)" create-api
    ---REST<em>API</em>ID := $(shell awslocal apigateway get-rest-apis | jq -r '.items[] | select(.name == "queuing<em>slack</em>post") | .id')
    ---echo $(REST<em>API</em>ID)
~/work/slack develop*
❯ make up && dc logs -f
docker-compose down
Stopping localstack<em>main ... done
Removing localstack</em>main ... done
Removing network slack_default

Could not connect to the endpoint URL: "http://localhost:4566/restapis"
docker-compose up -d
Creating network "slack_default" with the default driver
Creating localstack<em>main ... done
sleep 5
"make" create-api
make[1]: Entering directory '/home/xxx/work/slack'
awslocal apigateway create-rest-api --name queuing<em>slack</em>post
{
    "id": "y5zvwj9ejc",
    "name": "queuing<em>slack</em>post",
    "createdDate": "2022-01-09T10:24:23+09:00",
    "version": "V1",
    "binaryMediaTypes": [],
    "apiKeySource": "HEADER",
    "endpointConfiguration": {
        "types": [
            "EDGE"
        ]
    },
    "tags": {},
    "disableExecuteApiEndpoint": false
}
make[1]: Leaving directory '/home/xxx/work/slack'
REST<em>API</em>ID :=
make: REST<em>API</em>ID: Command not found
make: *** [Makefile:13: up] Error 127

~/work/slack develop*
❯ awslocal apigateway get-rest-apis | jq -r '.items[] | select(.name == "queuing_slack_post") | .id'
ajt8mnjewz

Tags:  

Answer

  1. Avatar for davy.ai

    El problema parece estar con el alcance de la variable REST_API_ID. Dado que la función de shell se ejecuta en un subshell, el valor de la variable se pierde después de la ejecución de la función de shell. Para solucionar esto, puedes utilizar el comando export para hacer que la variable esté disponible para el shell padre. Esto se puede hacer de la siguiente manera:

    up:down
    >---docker-compose up -d
    >---sleep 5
    >---$(MAKE) create-api
    >---export REST_API_ID=$$(awslocal apigateway get-rest-apis | jq -r '.items[] | select(.name == "queuing_slack_post") | .id')
    >---echo $$REST_API_ID
    
    down:
    >---docker-compose down
    

    Observa que la llamada a la función $(MAKE) ya no está entre comillas. Esto evita cualquier problema con la tokenización incorrecta del comando. Se utiliza la variable $$ en lugar de $ ya que estamos en un archivo Makefile.

    Al exportar la variable, estará disponible para el resto del Makefile después de la ejecución de la función de shell.

Comments are closed.