[{"data":1,"prerenderedAt":529},["Reactive",2],{"navigation":3,"/posts/w46-2022-tips-learned-this-week":204,"/posts/w46-2022-tips-learned-this-week-surround":498},[4,192,200],{"title":5,"_path":6,"children":7,"icon":191},"Blog","/posts",[8,11,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68,71,74,77,80,83,86,89,92,95,98,101,104,107,110,113,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,176,179,182,185,188],{"title":9,"_path":10},"Testing your API with REST Client","/posts/testing-your-api-with-rest-client",{"title":12,"_path":13},"HTML templating in Xamarin","/posts/html-templating-in-xamarin",{"title":15,"_path":16},"Goodbye Azure Portal, Welcome Azure CLI","/posts/welcome-azure-cli",{"title":18,"_path":19},"Coming across Gitpod","/posts/gitpod",{"title":21,"_path":22},"Handle token retrieval while querying an API","/posts/delegating-handler",{"title":24,"_path":25},"Clean up your local git branches.","/posts/cleaning-git-branches",{"title":27,"_path":28},"Automate configuration of Teams Tab SSO with PowerShell.","/posts/teams-sso-powershell",{"title":30,"_path":31},"How to do a technology watch? - Part 1","/posts/technology-watch-part1",{"title":33,"_path":34},"How to do a technology watch? - Part 2","/posts/technology-watch-part2",{"title":36,"_path":37},"You almost no longer need Key Vault references for Azure Functions.","/posts/azure-functions-custom-configuration",{"title":39,"_path":40},"How to do a technology watch? - Part 3","/posts/technology-watch-part3",{"title":42,"_path":43},"Forget DevOps, the future is already here!","/posts/devops-future",{"title":45,"_path":46},"Week 9, 2021 - Tips I learned this week","/posts/w09-2021-tips-learned-this-week",{"title":48,"_path":49},"Week 12, 2021 - Tips I learned this week","/posts/w12-2021-tips-learned-this-week",{"title":51,"_path":52},"Week 14, 2021 - Tips I learned this week","/posts/w14-2021-tips-learned-this-week",{"title":54,"_path":55},"Once upon a time in .NET","/posts/once-upon-a-time-in-dotnet",{"title":57,"_path":58},"Install your applications with winget","/posts/winget-import",{"title":60,"_path":61},"Customize your applications when installing them with winget","/posts/winget-override",{"title":63,"_path":64},"Week 22, 2021 - Tips I learned this week","/posts/w22-2021-tips-learned-this-week",{"title":66,"_path":67},"How to connect to an Azure SQL Database from C# using Azure AD","/posts/sqlclient-active-directory-authent",{"title":69,"_path":70},"Producing packages for Windows Package Manager","/posts/wingetcreate",{"title":72,"_path":73},"4 tips about GitHub Actions environment variables and contexts","/posts/github-actions-var-and-context",{"title":75,"_path":76},"AzureWebJobsStorage, the secret you don't need in your Function App.","/posts/azure-functions-without-azurewebjobsstorage",{"title":78,"_path":79},"ASP.NET Core - Lost in configuration","/posts/lost-in-configuration",{"title":81,"_path":82},"Week 39, 2021 - Tips I learned this week","/posts/w39-2021-tips-learned-this-week",{"title":84,"_path":85},"Week 41, 2021 - Tips I learned this week","/posts/w41-2021-tips-learned-this-week",{"title":87,"_path":88},"Migrating and open-sourcing my blog","/posts/migrating-blog",{"title":90,"_path":91},"Week 45, 2021 - Tips I learned this week","/posts/w45-2021-tips-learned-this-week",{"title":93,"_path":94},"Organize your GitHub stars with Astral","/posts/astral",{"title":96,"_path":97},"Pulumi with an Azure Blob Storage backend","/posts/pulumi-azure-backend",{"title":99,"_path":100},"IaC Hot Reload with Pulumi Watch","/posts/pulumi-watch",{"title":102,"_path":103},"Week 2, 2022 - Tips I learned this week","/posts/w02-2022-tips-learned-this-week",{"title":105,"_path":106},"Week 3, 2022 - Tips I learned this week","/posts/w03-2022-tips-learned-this-week",{"title":108,"_path":109},"Week 5, 2022 - Tips I learned this week","/posts/w05-2022-tips-learned-this-week",{"title":111,"_path":112},"How to provision an Azure SQL Database with Active Directory authentication","/posts/sqldatabase-active-directory-authent",{"title":114,"_path":115},"Why will I choose Pulumi over Terraform for my next project?","/posts/pulumi-vs-terraform",{"title":117,"_path":118},"Week 19, 2022 - Tips I learned this week","/posts/w19-2022-tips-learned-this-week",{"title":120,"_path":121},"Week 20, 2022 - Tips I learned this week","/posts/w20-2022-tips-learned-this-week",{"title":123,"_path":124},"Keeping secrets secure when using API Clients","/posts/http-clients-secrets",{"title":126,"_path":127},"What made me want to be a developer?","/posts/be-a-developer",{"title":129,"_path":130},"What can we do when stuck with a programming problem?","/posts/get-unstuck",{"title":132,"_path":133},"How did I automate the setup of my developer Windows laptop?","/posts/automate-developer-machine",{"title":135,"_path":136},"Discussion about API clients","/posts/http-clients",{"title":138,"_path":139},"Week 46, 2022 - Tips I learned this week","/posts/w46-2022-tips-learned-this-week",{"title":141,"_path":142},"When Pulumi met Nuke: a .NET love story","/posts/when-pulumi-met-nuke",{"title":144,"_path":145},"A year of learning and sharing - Dev Retro 2022","/posts/2022-retro",{"title":147,"_path":148},"Perform Dynamic Execution of an npm Package","/posts/pnpm-dlx",{"title":150,"_path":151},"Manage multiple Node.js versions","/posts/pnpm-env",{"title":153,"_path":154},"Introducing the Vue.js CI/CD series","/posts/vuecicd-introduction",{"title":156,"_path":157},"Execute commands using your project dependencies","/posts/pnpm-exec",{"title":159,"_path":160},"Vue.js CI/CD: Continuous Integration","/posts/vuecicd-ci",{"title":162,"_path":163},"Who is using pnpm?","/posts/pnpm-who-is-using",{"title":165,"_path":166},"Create an Azure-Ready GitHub Repository using Pulumi","/posts/azure-ready-github-repository",{"title":168,"_path":169},"Deploying to Azure from Azure DevOps without secrets","/posts/ado-workload-identity-federation",{"title":171,"_path":172},"Effortlessly Configure GitHub Repositories for Azure Deployment via OIDC","/posts/scripting-azure-ready-github-repository",{"title":174,"_path":175},"Playing with the .NET 8 Web API template","/posts/playing-with-dotnet8",{"title":177,"_path":178},"Another year of sharing and learning - Dev Retro 2023","/posts/2023-retro",{"title":180,"_path":181},"Week 4, 2024 - Tips I learned this week","/posts/w04-2024-tips-learned-this-week",{"title":183,"_path":184},"Using dependency injection with Azure .NET SDK","/posts/azure-sdk-di",{"title":186,"_path":187},"Having Fun With IT Event Calendars","/posts/it-event-calendars",{"title":189,"_path":190},"Call your Azure AD B2C protected API with authenticated HTTP requests from your JetBrains IDE","/posts/http-clients-oauth2","i-heroicons-newspaper",{"title":193,"_path":194,"children":195,"icon":199},"Goodies","/goodies",[196],{"title":197,"_path":198},"My Git Cheat Sheet","/goodies/gitcheatsheet","i-heroicons-gift-solid",{"title":201,"_path":202,"icon":203},"About","/about","i-heroicons-user-circle-solid",{"_path":139,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":138,"description":208,"lead":208,"date":209,"image":210,"badge":212,"tags":214,"body":223,"_type":493,"_id":494,"_source":495,"_file":496,"_extension":497},"posts",false,"","Some tips about .NET, pnpm, and Azure DevOps.","2022-11-20T00:00:00.000Z",{"src":211},"/images/surface_1.jpg",{"label":213},"Tips",[215,216,217,218,219,220,221,222],"tips learned this week",".NET","winget","pnpm","package manager","vscode","Azure DevOps","tooling",{"type":224,"children":225,"toc":488},"root",[226,235,252,281,304,310,341,346,356,370,382,391,396,406,415,429,435,440,450,468,477,482],{"type":227,"tag":228,"props":229,"children":231},"element","h2",{"id":230},"net-tip-of-the-week-install-net-7-using-winget",[232],{"type":233,"value":234},"text",".NET tip of the week: install .NET 7 using winget",{"type":227,"tag":236,"props":237,"children":238},"p",{},[239,241,250],{"type":233,"value":240},"This week, I installed .NET 7 on my laptop and I used ",{"type":227,"tag":242,"props":243,"children":247},"a",{"href":244,"rel":245},"https://learn.microsoft.com/en-us/windows/package-manager/",[246],"nofollow",[248],{"type":233,"value":249},"Windows Package Manager",{"type":233,"value":251}," for that:",{"type":227,"tag":253,"props":254,"children":258},"pre",{"className":255,"code":256,"language":257,"meta":207,"style":207},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","winget install Microsoft.DotNet.SDK.7\n","powershell",[259],{"type":227,"tag":260,"props":261,"children":262},"code",{"__ignoreMap":207},[263],{"type":227,"tag":264,"props":265,"children":268},"span",{"class":266,"line":267},"line",1,[269,275],{"type":227,"tag":264,"props":270,"children":272},{"style":271},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[273],{"type":233,"value":274},"winget install Microsoft.DotNet.SDK.",{"type":227,"tag":264,"props":276,"children":278},{"style":277},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[279],{"type":233,"value":280},"7\n",{"type":227,"tag":236,"props":282,"children":283},{},[284,286,293,295,302],{"type":233,"value":285},"I like winget, I have already written a few articles about it (you can find them ",{"type":227,"tag":242,"props":287,"children":290},{"href":288,"rel":289},"https://www.techwatching.dev/tags/winget/",[246],[291],{"type":233,"value":292},"here",{"type":233,"value":294},") so I am really glad to see that we can now use winget to install .NET (whether it be the SDKs or the runtimes). You can check ",{"type":227,"tag":242,"props":296,"children":299},{"href":297,"rel":298},"https://devblogs.microsoft.com/dotnet/dotnet-now-on-windows-package-manager/",[246],[300],{"type":233,"value":301},"Microsoft's article",{"type":233,"value":303}," announcing it for more information.",{"type":227,"tag":228,"props":305,"children":307},{"id":306},"tool-of-the-week-pnpm",[308],{"type":233,"value":309},"Tool of the week: pnpm",{"type":227,"tag":236,"props":311,"children":312},{},[313,315,321,323,330,332,339],{"type":233,"value":314},"I don't know which JavaScript package manager you are using but since I tried ",{"type":227,"tag":242,"props":316,"children":319},{"href":317,"rel":318},"https://pnpm.io/",[246],[320],{"type":233,"value":218},{"type":233,"value":322}," I don't want to use anything else because it's so fast! If you are interested to know why it's so fast and better than npm for instance, you can watch the talk ",{"type":227,"tag":242,"props":324,"children":327},{"href":325,"rel":326},"https://viteconf.org/2022/replay/pnpm",[246],[328],{"type":233,"value":329},"\"What makes pnpm performant\"",{"type":233,"value":331}," that Zoltan Kochan gave at Vite Conf. Many ",{"type":227,"tag":242,"props":333,"children":336},{"href":334,"rel":335},"https://pnpm.io/workspaces#usage-examples",[246],[337],{"type":233,"value":338},"popular open-source projects",{"type":233,"value":340}," like Vite and Vue are using pnpm.",{"type":227,"tag":236,"props":342,"children":343},{},[344],{"type":233,"value":345},"Here are some tips about pnpm:",{"type":227,"tag":347,"props":348,"children":349},"ol",{},[350],{"type":227,"tag":351,"props":352,"children":353},"li",{},[354],{"type":233,"value":355},"You can use pnpm to manage Node.js versions on your machine",{"type":227,"tag":236,"props":357,"children":358},{},[359,361,368],{"type":233,"value":360},"Previously, I was using ",{"type":227,"tag":242,"props":362,"children":365},{"href":363,"rel":364},"https://github.com/coreybutler/nvm-windows",[246],[366],{"type":233,"value":367},"nvm-windows",{"type":233,"value":369}," to manage multiple installation of Node.js on my laptop and it worked fine. Yet I can now do that directly using pnpm env command:",{"type":227,"tag":236,"props":371,"children":372},{},[373],{"type":227,"tag":374,"props":375,"children":381},"img",{"alt":376,"className":377,"src":380},"Output of the pnpm env command in a terminal.",[378,379],"rounded-lg","mx-auto","/posts/images/w462022tips_pnpm_env.png",[],{"type":227,"tag":347,"props":383,"children":385},{"start":384},2,[386],{"type":227,"tag":351,"props":387,"children":388},{},[389],{"type":233,"value":390},"You can configure vscode to run npm scripts using pnpm",{"type":227,"tag":236,"props":392,"children":393},{},[394],{"type":233,"value":395},"A lot of the people I know don't use the scripts explorer of vscode to run the scripts contained in the package.json file of the project opened in vscode. It's a pity because it is an handy feature. And you can configure it in your settings to run scripts using a specific package manager, pnpm in my case.",{"type":227,"tag":236,"props":397,"children":398},{},[399],{"type":227,"tag":374,"props":400,"children":405},{"alt":401,"className":402,"src":403,"width":404},"Npm scripts view in vscode editor.",[378,379],"/posts/images/w462022tips_pnpm_scripts.png",600,[],{"type":227,"tag":347,"props":407,"children":409},{"start":408},3,[410],{"type":227,"tag":351,"props":411,"children":412},{},[413],{"type":233,"value":414},"With pnpm, you can use aliases for packages you install",{"type":227,"tag":236,"props":416,"children":417},{},[418,420,427],{"type":233,"value":419},"Check the ",{"type":227,"tag":242,"props":421,"children":424},{"href":422,"rel":423},"https://pnpm.io/aliases",[246],[425],{"type":233,"value":426},"documentation",{"type":233,"value":428}," to see why and how to use this feature.",{"type":227,"tag":228,"props":430,"children":432},{"id":431},"the-gitlensazure-devops-tip-you-did-not-know-about-autolinks",[433],{"type":233,"value":434},"The GitLens/Azure DevOps tip you did not know about: autolinks",{"type":227,"tag":236,"props":436,"children":437},{},[438],{"type":233,"value":439},"GitLens, the awesome extension for vscode has a nice feature called \"autolinks\" that can make external references in your commit messages clickable links.",{"type":227,"tag":236,"props":441,"children":442},{},[443],{"type":227,"tag":374,"props":444,"children":449},{"alt":445,"className":446,"src":447,"width":448},"Autolinks GitLens settings view in vscode.",[378,379],"/posts/images/w462022tips_gitlens_autolink_1.png",1000,[],{"type":227,"tag":236,"props":451,"children":452},{},[453,455,462],{"type":233,"value":454},"If you are using Azure DevOps, this feature can become very handy for you commit messages that contain references to work items (usually an hasjtag followed by the work item number). You just have to configure # as the prefix and ",{"type":227,"tag":242,"props":456,"children":459},{"href":457,"rel":458},"https://dev.azure.com/%7BorganizationName%7D/%7BprojectName%7D/_workitems/edit/",[246],[460],{"type":233,"value":461},"https://dev.azure.com/{organizationName}/{projectName}/_workitems/edit/",{"type":227,"tag":463,"props":464,"children":465},"num",{},[466],{"type":233,"value":467}," as the URL) to make it work.",{"type":227,"tag":236,"props":469,"children":470},{},[471],{"type":227,"tag":374,"props":472,"children":476},{"alt":473,"className":474,"src":475,"width":448},"A commit GitLens popin in vscode with an Azure DevOps link.",[378,379],"/posts/images/w462022tips_gitlens_autolink_2.png",[],{"type":227,"tag":236,"props":478,"children":479},{},[480],{"type":233,"value":481},"And that's it for this week, happy learning!",{"type":227,"tag":483,"props":484,"children":485},"style",{},[486],{"type":233,"value":487},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":207,"searchDepth":384,"depth":384,"links":489},[490,491,492],{"id":230,"depth":384,"text":234},{"id":306,"depth":384,"text":309},{"id":431,"depth":384,"text":434},"markdown","content:1.posts:44.w46-2022-tips-learned-this-week.md","content","1.posts/44.w46-2022-tips-learned-this-week.md","md",[499,515],{"_path":142,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":141,"description":500,"lead":501,"date":502,"image":503,"badge":505,"tags":507,"_type":493,"_id":513,"_source":495,"_file":514,"_extension":497},"Today is a great time to be a developer:","Pushing an ASP.NET Core API to Azure using .NET from provisioning to deployment","2022-12-18T00:00:00.000Z",{"src":504},"/images/trees_1.jpg",{"label":506},"DevOps",[216,508,509,510,511,506,512],"Nuke","Pulumi","Pipelines","IaC","Azure","content:1.posts:45.when-pulumi-met-nuke.md","1.posts/45.when-pulumi-met-nuke.md",{"_path":136,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":135,"description":516,"lead":517,"date":518,"image":519,"badge":521,"tags":523,"_type":493,"_id":527,"_source":495,"_file":528,"_extension":497},"This article is a discussion about API clients. Without being a comparison between the best API clients, this article talks about the pros and cons of some popular tools to send HTTP requests to an API. The goal is not to elect the best one, but rather to try to answer the following question: what we should consider when choosing an API client, and what are the challenges when using one?","What should you consider when choosing an API client?","2022-09-08T00:00:00.000Z",{"src":520},"/images/tools_1.jpg",{"label":522},"Tooling",[222,524,525,526],"HTTP","thoughts","rest","content:1.posts:43.http-clients.md","1.posts/43.http-clients.md",1716749601541]