[{"data":1,"prerenderedAt":436},["Reactive",2],{"navigation":3,"/posts/pnpm-exec":204,"/posts/pnpm-exec-surround":413},[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":157,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":156,"description":208,"lead":209,"date":210,"image":211,"badge":213,"tags":215,"canonical":219,"body":220,"_type":408,"_id":409,"_source":410,"_file":411,"_extension":412},"posts",false,"","You have a dependency in your project and want to execute a command using it? The pnpm exec command can help you with that.","pnpm exec","2023-06-15T00:00:00.000Z",{"src":212},"/images/pnpm.png",{"label":214},"Tooling",[216,217,218],"pnpm","package manager","tooling","https://bordeauxcoders.com/execute-commands-using-your-project-dependencies",{"type":221,"children":222,"toc":402},"root",[223,241,248,297,309,315,343,349,354,384,396],{"type":224,"tag":225,"props":226,"children":227},"element","p",{},[228,231,239],{"type":229,"value":230},"text","You have a dependency in your project and want to execute a command using it? The ",{"type":224,"tag":232,"props":233,"children":237},"a",{"href":234,"rel":235},"https://pnpm.io/cli/exec",[236],"nofollow",[238],{"type":229,"value":209},{"type":229,"value":240}," command can help you with that.",{"type":224,"tag":242,"props":243,"children":245},"h2",{"id":244},"an-example",[246],{"type":229,"value":247},"An example",{"type":224,"tag":249,"props":250,"children":254},"pre",{"className":251,"code":252,"language":253,"meta":207,"style":207},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight"," pnpm exec eslint . --ext .ts\n","bash",[255],{"type":224,"tag":256,"props":257,"children":258},"code",{"__ignoreMap":207},[259],{"type":224,"tag":260,"props":261,"children":264},"span",{"class":262,"line":263},"line",1,[265,271,277,282,287,292],{"type":224,"tag":260,"props":266,"children":268},{"style":267},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[269],{"type":229,"value":270}," pnpm",{"type":224,"tag":260,"props":272,"children":274},{"style":273},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[275],{"type":229,"value":276}," exec",{"type":224,"tag":260,"props":278,"children":279},{"style":273},[280],{"type":229,"value":281}," eslint",{"type":224,"tag":260,"props":283,"children":284},{"style":273},[285],{"type":229,"value":286}," .",{"type":224,"tag":260,"props":288,"children":289},{"style":273},[290],{"type":229,"value":291}," --ext",{"type":224,"tag":260,"props":293,"children":294},{"style":273},[295],{"type":229,"value":296}," .ts\n",{"type":224,"tag":225,"props":298,"children":299},{},[300,302,307],{"type":229,"value":301},"Given that ESLint is a project dependency, this example shows how to use the ",{"type":224,"tag":256,"props":303,"children":305},{"className":304},[],[306],{"type":229,"value":209},{"type":229,"value":308}," command to run the ESLint tool on all TypeScript files within the project.",{"type":224,"tag":242,"props":310,"children":312},{"id":311},"some-use-cases",[313],{"type":229,"value":314},"Some use cases",{"type":224,"tag":316,"props":317,"children":318},"ul",{},[319,325,330],{"type":224,"tag":320,"props":321,"children":322},"li",{},[323],{"type":229,"value":324},"You need to do a specific command that is not part of your npm scripts",{"type":224,"tag":320,"props":326,"children":327},{},[328],{"type":229,"value":329},"You want to execute a tool that is a dependency of your project without having to install it globally",{"type":224,"tag":320,"props":331,"children":332},{},[333,335,341],{"type":229,"value":334},"You need to execute a CLI package command in a CI pipeline, and this package is already included in the ",{"type":224,"tag":256,"props":336,"children":338},{"className":337},[],[339],{"type":229,"value":340},"devDependencies",{"type":229,"value":342}," of your project.",{"type":224,"tag":242,"props":344,"children":346},{"id":345},"good-to-know",[347],{"type":229,"value":348},"Good to know",{"type":224,"tag":225,"props":350,"children":351},{},[352],{"type":229,"value":353},"If the command you are using does not conflict with a built-in pnpm command, there is no need to specify 'exec'. Referring to the previous example, you can simply run:",{"type":224,"tag":249,"props":355,"children":357},{"className":251,"code":356,"language":253,"meta":207,"style":207}," pnpm eslint . --ext .ts\n",[358],{"type":224,"tag":256,"props":359,"children":360},{"__ignoreMap":207},[361],{"type":224,"tag":260,"props":362,"children":363},{"class":262,"line":263},[364,368,372,376,380],{"type":224,"tag":260,"props":365,"children":366},{"style":267},[367],{"type":229,"value":270},{"type":224,"tag":260,"props":369,"children":370},{"style":273},[371],{"type":229,"value":281},{"type":224,"tag":260,"props":373,"children":374},{"style":273},[375],{"type":229,"value":286},{"type":224,"tag":260,"props":377,"children":378},{"style":273},[379],{"type":229,"value":291},{"type":224,"tag":260,"props":381,"children":382},{"style":273},[383],{"type":229,"value":296},{"type":224,"tag":225,"props":385,"children":386},{},[387,389,394],{"type":229,"value":388},"It's one of the small details that make using ",{"type":224,"tag":256,"props":390,"children":392},{"className":391},[],[393],{"type":229,"value":216},{"type":229,"value":395}," so pleasant.",{"type":224,"tag":397,"props":398,"children":399},"style",{},[400],{"type":229,"value":401},"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":403,"depth":403,"links":404},2,[405,406,407],{"id":244,"depth":403,"text":247},{"id":311,"depth":403,"text":314},{"id":345,"depth":403,"text":348},"markdown","content:1.posts:50.pnpm-exec.md","content","1.posts/50.pnpm-exec.md","md",[414,427],{"_path":160,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":159,"description":415,"date":416,"image":417,"badge":419,"tags":421,"canonical":424,"_type":408,"_id":425,"_source":410,"_file":426,"_extension":412},"Post about continuous integration with Vue.js.","2023-06-22T00:00:00.000Z",{"src":418},"/images/vue-cicd.webp",{"label":420},"DevOps",[422,423,420],"Vue.js","CI/CD","https://bordeauxcoders.com/vuejs-cicd-continuous-integration","content:1.posts:51.vuecicd-ci.md","1.posts/51.vuecicd-ci.md",{"_path":154,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":153,"description":428,"date":429,"image":430,"badge":431,"tags":432,"canonical":433,"_type":408,"_id":434,"_source":410,"_file":435,"_extension":412},"This is the first article of the Vue.js CI/CD series. It will be the opportunity to explain the purpose of the series and the topics we plan to cover.","2023-06-01T00:00:00.000Z",{"src":418},{"label":420},[422,423,420],"https://bordeauxcoders.com/introducing-the-vuejs-cicd-series","content:1.posts:49.vuecicd-introduction.md","1.posts/49.vuecicd-introduction.md",1716749601515]