Azure / azure-functions-core-tools

Command line tools for Azure Functions
MIT License
1.32k stars 433 forks source link

Support for creating the zip archive only #1726

Open sschmeck opened 4 years ago

sschmeck commented 4 years ago

When using Azure Functions Core Tools in conjunction with Terraform, you have to create the uploaded zip archive manually. Since azure-functions-core-tools already implemented the logic to create the archive, the archive could also be saved as file, provided via CLI, e.g. as --zip-only option.

https://github.com/Azure/azure-functions-core-tools/blob/dab8daca606d1a6f398b01b6f29ce8f081c34ec9/src/Azure.Functions.Cli/Actions/AzureActions/PublishFunctionAppAction.cs#L692

ankitkumarr commented 4 years ago

We don't have full documentation for this, but you could also use func pack which should create a zip file. func pack takes parameters similar to func azure functionapp publish.

sschmeck commented 4 years ago

Thanks for the suggestion. I didn't know the pack action. But the zip archives generated by pack and uploaded by azure functionapp publish differ.

It seems that pack adds most of the root directory to the archive (e.g. node_modules). The method ZipHelper.GetAppZipFile() is called differently by both actions. Whereas the method is called with ignoreParser by the PublishFunctionAppAction, the ignoreParser is not set by the PackAction. Is it intended?

After some adaptions of the .funcignore file, the pack action matches my needs perfectly. :+1:

I've setup a TypeScript function app and removed all unnecessary files of the archive by the .funcignore:

  1. Replaced *.js.map, *.ts by **.js.map, **.ts to ignore these files in subfolders, too.
  2. Added node_modules to avoid npm prune locally.
  3. Added packag*.json and tsconfig.json because it isn't required in the archive.

Couldn't find any documentation about pack action and the supported syntax of the .funcignore file . Is there a reason?

Thanks. :smile:

tleguijt commented 3 years ago

Some extra documentation on this would be great! We're also using the pack function to create the ZIP files. On Python packages this seems to be working pretty well, but we have some issues with Node packages.

We have a Typescript project, each function has their own directory with an function.json (nothing unusual here). Everything is compiled into a dist directory.

Now when we run func pack some things gets packaged, so we have;

However, the directories with the function.json are missing. In some cases (seems quite random - locally it packages the dist directory but on our CI which is using the mcr.microsoft.com/azure-functions/node:3.0-node12-core-tools docker image it's missing). So we have to do dirty tricks like:

func pack -o build/$NAME --javascript
# For some reason; func pack doesnt do this for us;
find . -name function.json | xargs zip -ur build/$NAME.zip
zip -ur build/$NAME.zip dist
zip -ur build/$NAME.zip node_modules

.funcignore just contains the usual; of course double checked if function.json is not part of this ;-)

It would be great if func pack would be documented and if inconsistencies could be eliminated

BzSpi commented 3 years ago

This pack function is extremely useful in order to package and distribute an application, especially an open source one. It fits very well in a CI/CD pipeline.

Please, add at least the pack subcommand to the help message.