{"id":7321,"date":"2023-03-14T15:13:48","date_gmt":"2023-03-14T15:13:48","guid":{"rendered":"https:\/\/cloudsurfers.it\/?p=7321"},"modified":"2023-03-14T15:13:48","modified_gmt":"2023-03-14T15:13:48","slug":"creare-e-testare-una-azure-functions-su-macos-con-vscode","status":"publish","type":"post","link":"https:\/\/cloudsurfers.it\/index.php\/creare-e-testare-una-azure-functions-su-macos-con-vscode\/","title":{"rendered":"Creare e testare una Azure Functions su MacOS con VSCODE"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"400\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-13.png\" alt=\"\" class=\"wp-image-7322\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-13.png 800w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-13-300x150.png 300w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-13-768x384.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>In questo articolo andremo a sviluppare una&nbsp;<em><a href=\"https:\/\/azure.microsoft.com\/it-it\/products\/functions\/?ef_id=Cj0KCQiAutyfBhCMARIsAMgcRJTKp0IZw1zQArHiGl66PwT0_Vuq98MFAkcmmUCDvLJCBiR9LFKpcY8aAqwSEALw_wcB%3AG%3As&amp;OCID=AIDcmmy6frl1tq_SEM_Cj0KCQiAutyfBhCMARIsAMgcRJTKp0IZw1zQArHiGl66PwT0_Vuq98MFAkcmmUCDvLJCBiR9LFKpcY8aAqwSEALw_wcB%3AG%3As&amp;gclid=Cj0KCQiAutyfBhCMARIsAMgcRJTKp0IZw1zQArHiGl66PwT0_Vuq98MFAkcmmUCDvLJCBiR9LFKpcY8aAqwSEALw_wcB\" target=\"_blank\" rel=\"noreferrer noopener\">Azure Functions<\/a><\/em>, pi\u00f9 nello specifico una funzione invocata da un timer ogni 30esimo secondo di ogni minuto, utilizzando&nbsp;<em><a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Visual Studio Code<\/a><\/em>&nbsp;su un ambiente con sistema operativo&nbsp;<em>MacOS<\/em>.<\/p>\n\n\n\n<p>Per maggiori dettagli ed approfondimenti sulle&nbsp;<em>Azure Functions<\/em>&nbsp;e su quali siano i casi di utilizzo vi consiglio la lettura di un nostro&nbsp;<a href=\"https:\/\/cloudsurfers.it\/index.php\/azure-functions-entity-framework\/\" target=\"_blank\" rel=\"noreferrer noopener\">precedente articolo<\/a>, oppure l&#8217;introduzione alle funzioni&nbsp;<em>Azure<\/em>&nbsp;della&nbsp;<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-functions\/functions-overview\" target=\"_blank\" rel=\"noreferrer noopener\">documentazione ufficiale<\/a>&nbsp;Microsoft.<\/p>\n\n\n\n<p>Iniziamo con la predisposizione dell&#8217;ambiente di sviluppo. <\/p>\n\n\n\n<p>In primis \u00e8 necessario aver installato&nbsp;<em><a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Visual Studio Code<\/a><\/em>, se non presente.<\/p>\n\n\n\n<p>Successivamente, dal pannello&nbsp;<strong>Estensioni<\/strong>&nbsp;della barra laterale sinistra di&nbsp;<em>VSCODE<\/em>, \u00e8 necessario installare i due plugin&nbsp;<strong><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-azuretools.vscode-azurefunctions\" target=\"_blank\" rel=\"noreferrer noopener\">Azure Functions<\/a><\/strong>&nbsp;ed&nbsp;<strong><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=Azurite.azurite\" target=\"_blank\" rel=\"noreferrer noopener\">Azurite<\/a><\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-14.png\" alt=\"\" class=\"wp-image-7323\" width=\"432\" height=\"142\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-14.png 525w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-14-300x98.png 300w\" sizes=\"auto, (max-width: 432px) 100vw, 432px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-15.png\" alt=\"\" class=\"wp-image-7324\" width=\"432\" height=\"144\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-15.png 523w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-15-300x100.png 300w\" sizes=\"auto, (max-width: 432px) 100vw, 432px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>L&#8217;estensione&nbsp;<em>Azure Functions<\/em>&nbsp;ci fornir\u00e0 strumenti utili per la creazione, gestione e pubblicazione delle funzioni&nbsp;<em>Azure<\/em>.&nbsp;<em>Azurite<\/em>&nbsp;invece, \u00e8 un server compatibile&nbsp;<em>Azure Storage API<\/em>&nbsp;per poter avviare un&#8217;istanza&nbsp;<em><a href=\"https:\/\/azure.microsoft.com\/en-us\/products\/storage\/blobs\" target=\"_blank\" rel=\"noreferrer noopener\">Blob Storage<\/a><\/em>&nbsp;per eseguire e testare localmente una funzione&nbsp;<em>Azure<\/em>.<\/p>\n\n\n\n<p>Iniziamo con la creazione del progetto.<\/p>\n\n\n\n<p>Tramite la&nbsp;<em>palette<\/em>&nbsp;di comando&nbsp;<em>VSCODE<\/em>&nbsp;(<em>Cmd + Maiusc + P<\/em>), cerchiamo &#8220;azure functions&#8221; e selezioniamo la voce&nbsp;<strong>Azure Functions: Create New Project&#8230;<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-16.png\" alt=\"\" class=\"wp-image-7325\" width=\"514\" height=\"391\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-16.png 648w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-16-300x228.png 300w\" sizes=\"auto, (max-width: 514px) 100vw, 514px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Selezioniamo la cartella di destinazione del progetto, il linguaggio ed il framework di destinazione (in questo esempio&nbsp;<em>C#<\/em>&nbsp;e&nbsp;<em>.NET 7.0<\/em>), il tipo di&nbsp;<em>trigger<\/em>&nbsp;della funzione (<em>Timer<\/em>&nbsp;per esempio) ed in fine il nome della funzione, di default &#8220;TimerTrigger1&#8221;, il namespace del progetto, &#8220;Company.Function&#8221; di default e l&#8217;intervallo di esecuzione&nbsp;<em>chrono expression<\/em>&nbsp;visto che abbiamo scelto un&nbsp;<em>Timer<\/em>&nbsp;<em>trigger<\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"911\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-17-1024x911.png\" alt=\"\" class=\"wp-image-7326\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-17-1024x911.png 1024w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-17-300x267.png 300w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-17-768x684.png 768w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-17.png 1109w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Di default l&#8217;espressione che determina l&#8217;intervallo sar\u00e0 preimpostata &#8220;<strong>0 *\/5 * * * *<\/strong>&#8221; che significa che l&#8217;esecuzione avverr\u00e0 al secondo zero di ogni quinto minuto.<br>Modifichiamo questo valore, all&#8217;interno degli argomenti della funzione&nbsp;<em>Run<\/em>, in &#8220;<strong>30 * * * * *<\/strong>&#8221; che significa che l&#8217;esecuzione verr\u00e0 effettuata il 30esimo secondo di ogni minuto.<\/p>\n\n\n\n<p>Per aiutarvi con le&nbsp;<em>chrono expression<\/em>, potete utilizzare uno strumento online come&nbsp;<em><a href=\"https:\/\/crontab.cronhub.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">crontab.cronhub.io<\/a><\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-18.png\" alt=\"\" class=\"wp-image-7327\" width=\"608\" height=\"176\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-18.png 877w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-18-300x87.png 300w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-18-768x222.png 768w\" sizes=\"auto, (max-width: 608px) 100vw, 608px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Prima di eseguire la funzione che abbiamo appena creato, dobbiamo avviare il componente&nbsp;<em>Azurite<\/em>.<br>Dalla&nbsp;<em>Command Palette&#8230;<\/em>&nbsp;cerchiamo &#8220;azurite&#8221; e selezioniamo&nbsp;<strong>Azurite: Start<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"611\" height=\"137\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-19.png\" alt=\"\" class=\"wp-image-7328\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-19.png 611w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-19-300x67.png 300w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Apriamo il file&nbsp;<strong>local.settings.json<\/strong>&nbsp;(file che contiene i parametri di impostazione per l&#8217;esecuzione locale della funzione&nbsp;<em>Azure<\/em>) e modifichiamolo come segue.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n{\n  &quot;IsEncrypted&quot;: false,\n  &quot;Values&quot;: {\n    &quot;AzureWebJobsStorage&quot;: &quot;UseDevelopmentStorage=true&quot;,\n    &quot;FUNCTIONS_WORKER_RUNTIME&quot;: &quot;dotnet-isolated&quot;\n  }\n}\n<\/pre><\/div>\n\n\n<p>Il valore della chiave&nbsp;<em>AzureWebJobsStorage<\/em>&nbsp;impostato a&nbsp;<strong>UseDevelopmentStorage=true<\/strong>&nbsp;indica alla funzione che deve collegarsi all&#8217;istanza locale&nbsp;<em>Azurite<\/em>&nbsp;avviata in precedenza.<\/p>\n\n\n\n<p>Avviamo ora la funzione con&nbsp;<strong>F5<\/strong>.<\/p>\n\n\n\n<p>All&#8217;interno del terminale di&nbsp;<em>VSCODE<\/em>, ogni 30esimo secondo di ogni minuto, verranno stampati i due metodi&nbsp;<em>LogInformation<\/em>&nbsp;presenti all&#8217;interno del metodo <em>Run<\/em> della funzione.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"309\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-20-1024x309.png\" alt=\"\" class=\"wp-image-7329\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-20-1024x309.png 1024w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-20-300x90.png 300w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-20-768x231.png 768w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-20.png 1188w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pubblicazione su Azure<\/h3>\n\n\n\n<p>Vediamo come pubblicare la funzione appena creata su&nbsp;<em>Azure<\/em>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Presupponiamo che siate gi\u00e0 in possesso di una sottoscrizione Azure ed abbiate gi\u00e0 creato una risorsa Azure Functions su cui verr\u00e0 effettuato il deploy.<\/p>\n<\/blockquote>\n\n\n\n<p>Dal terminale&nbsp;<em>VSCODE<\/em>, nella&nbsp;<em>root<\/em>&nbsp;del progetto, lanciamo il comando&nbsp;<code>dotnet publish -c Release demo.csproj<\/code>.<\/p>\n\n\n\n<p>Al termine della pubblicazione, click destro sulla cartella&nbsp;<em>publish<\/em>&nbsp;appena generata e selezioniamo&nbsp;<strong>Deploy to Function App&#8230;<\/strong>&nbsp;per eseguire il&nbsp;<em>deploy<\/em>&nbsp;su&nbsp;<em>Azure<\/em>&nbsp;(verr\u00e0 richiesto l&#8217;accesso alla sottoscrizione e la selezione della risorsa su cui effettuare il&nbsp;<em>deploy<\/em>).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-21.png\" alt=\"\" class=\"wp-image-7330\" width=\"298\" height=\"554\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-21.png 432w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2023\/02\/image-21-161x300.png 161w\" sizes=\"auto, (max-width: 298px) 100vw, 298px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Grazie alle caratteristiche multipiattaforma di <em>Visual Studio Code<\/em>, questa guida \u00e8 replicabile anche in ambiente <em>Windows<\/em> e <em>Linux<\/em>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo articolo andremo a sviluppare una Azure Functions, pi\u00f9 nello specifico una funzione invocata da un timer ogni 30esimo secondo di ogni minuto, utilizzando Visual Studio Code su sistema operativo MacOS.<\/p>\n","protected":false},"author":3,"featured_media":7322,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wds_primary_category":0,"footnotes":""},"categories":[90,130,76,41,36,71,210],"tags":[213,43,214,163,126,110,211,215],"class_list":["post-7321","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-insights","category-azure-en","category-azure","category-guide","category-guides","category-visual-studio-code","tag-net","tag-azure","tag-dotnet","tag-functions","tag-macos","tag-tutorial","tag-visual-studio","tag-vscode"],"_links":{"self":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts\/7321","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/comments?post=7321"}],"version-history":[{"count":0,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts\/7321\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/media\/7322"}],"wp:attachment":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/media?parent=7321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/categories?post=7321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/tags?post=7321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}