{"id":4847,"date":"2019-08-20T22:34:30","date_gmt":"2019-08-21T05:34:30","guid":{"rendered":"https:\/\/www.cloudnotes.io\/?p=4847"},"modified":"2019-08-24T16:26:28","modified_gmt":"2019-08-24T23:26:28","slug":"powershell-core-binary-module-with-visual-studio-code","status":"publish","type":"post","link":"https:\/\/www.cloudnotes.io\/powershell-core-binary-module-with-visual-studio-code\/","title":{"rendered":"Powershell Core binary module with Visual Studio Code"},"content":{"rendered":"\n<p>I wrote countless scripts and a good amount of modules (and functions) in my years as Service Engineer but all of them are <em>script<\/em> modules, I never really created <em>binary<\/em> modules. The main reason is that I like to write in Powershell but I also like the fact that, not being a compiled language, it is very easy to share and modify the source code for a script module and it is immediately ready to be reloaded and used. Anyway out of curiosity and to learn a different approach to building modules, I decided to try to convert one of mine from script to binary; my first step was (of course) a quick search to find some samples and <em>getting started<\/em> articles and I found a few good ones (referenced below) but all of them use Visual Studio and the full version of the .NET Framework, while I want to use Visual Studio Code and .NET Core. So here&#8217;s what I came up with.<\/p>\n\n\n\n<p>First off of course I need <a rel=\"noreferrer noopener\" aria-label=\".NET Core (opens in a new tab)\" href=\"https:\/\/dotnet.microsoft.com\" target=\"_blank\">.NET Core<\/a> (I am using the latest .NET Core 3 preview 8 at the moment), <a rel=\"noreferrer noopener\" href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\">Visual Studio Code<\/a> and the <a rel=\"noreferrer noopener\" aria-label=\"C# Extension (opens in a new tab)\" href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-vscode.csharp\" target=\"_blank\">C# Extension<\/a>. Next, I&#8217;m going to create a Class Library project using <code>dotnet<\/code> at the command line; note the <code>-f<\/code> parameter to indicate the framework version I want to use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"2,7\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">PS > dotnet new classlib -f netcoreapp3.0 -o HelloWorldCore\nCouldn't find an installed template that matches the input, searching online for one that does...\nMatches from template source: NuGet\n-----------------------------------\nTemplate name \"Razor Class Library\" (razorclasslib) from author \"Microsoft\" in pack Microsoft.DotNet.Web.ProjectTemplates.2.2\n    To use this template, run the following command and try again:\n        dotnet new -i Microsoft.DotNet.Web.ProjectTemplates.2.2::2.2.6<\/pre>\n\n\n\n<p>Since I am attempting this command on a fresh installation I am missing some templates but luckily <code>dotnet<\/code> suggests the command to run to fix this problem: <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1,2\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">PS > dotnet new -i Microsoft.DotNet.Web.ProjectTemplates.2.2::2.2.6\n  Restore completed in 1.73 sec for C:\\Users\\carlo\\.templateengine\\dotnetcli\\v3.0.100-preview8-013656\\scratch\\restore.csproj.\n\nUsage: new [options]\n\nOptions:\n  -h, --help          Displays help for this command.\n  -l, --list          Lists templates containing the specified name. If no name is specified, lists all templates.\n  -n, --name          The name for the output being created. If no name is specified, the name of the current directory is used.\n  -o, --output        Location to place the generated output.\n  -i, --install       Installs a source or a template pack.\n  -u, --uninstall     Uninstalls a source or a template pack.\n  --nuget-source      Specifies a NuGet source to use during install.\n  --type              Filters templates based on available types. Predefined values are \"project\", \"item\" or \"other\".\n  --dry-run           Displays a summary of what would happen if the given command line were run if it would result in a template creation.\n  --force             Forces content to be generated even if it would change existing files.\n  -lang, --language   Filters templates based on language and specifies the language of the template to create.\n  --update-check      Check the currently installed template packs for updates.\n  --update-apply      Check the currently installed template packs for update, and install the updates.\n\n\nTemplates                                         Short Name               Language          Tags\n----------------------------------------------------------------------------------------------------------------------------------\nConsole Application                               console                  [C#], F#, VB      Common\/Console\nClass library                                     classlib                 [C#], F#, VB      Common\/Library\nWPF Application                                   wpf                      [C#], VB          Common\/WPF\nWPF Class library                                 wpflib                   [C#], VB          Common\/WPF\nWPF Custom Control Library                        wpfcustomcontrollib      [C#], VB          Common\/WPF\nWPF User Control Library                          wpfusercontrollib        [C#], VB          Common\/WPF\nWindows Forms (WinForms) Application              winforms                 [C#], VB          Common\/WinForms\nWindows Forms (WinForms) Class library            winformslib              [C#], VB          Common\/WinForms\nWorker Service                                    worker                   [C#]              Common\/Worker\/Web\nUnit Test Project                                 mstest                   [C#], F#, VB      Test\/MSTest\nNUnit 3 Test Project                              nunit                    [C#], F#, VB      Test\/NUnit\nNUnit 3 Test Item                                 nunit-test               [C#], F#, VB      Test\/NUnit\nxUnit Test Project                                xunit                    [C#], F#, VB      Test\/xUnit\nRazor Component                                   razorcomponent           [C#]              Web\/ASP.NET\nRazor Page                                        page                     [C#]              Web\/ASP.NET\nMVC ViewImports                                   viewimports              [C#]              Web\/ASP.NET\nMVC ViewStart                                     viewstart                [C#]              Web\/ASP.NET\nBlazor Server App                                 blazorserver             [C#]              Web\/Blazor\nASP.NET Core Empty                                web                      [C#], F#          Web\/Empty\nASP.NET Core Web App (Model-View-Controller)      mvc                      [C#], F#          Web\/MVC\nASP.NET Core Web App                              webapp                   [C#]              Web\/MVC\/Razor Pages\nASP.NET Core with Angular                         angular                  [C#]              Web\/MVC\/SPA\nASP.NET Core with React.js                        react                    [C#]              Web\/MVC\/SPA\nASP.NET Core with React.js and Redux              reactredux               [C#]              Web\/MVC\/SPA\nRazor Class Library                               razorclasslib            [C#]              Web\/Razor\/Library\/Razor Class Library\nASP.NET Core Web API                              webapi                   [C#], F#          Web\/WebAPI\nASP.NET Core gRPC Service                         grpc                     [C#]              Web\/gRPC\ndotnet gitignore file                             gitignore                                  Config\nglobal.json file                                  globaljson                                 Config\nNuGet Config                                      nugetconfig                                Config\nDotnet local tool manifest file                   tool-manifest                              Config\nWeb Config                                        webconfig                                  Config\nSolution File                                     sln                                        Solution\nProtocol Buffer File                              proto                                      Web\/gRPC\n\nExamples:\n    dotnet new mvc --auth Individual\n    dotnet new nunit-test\n    dotnet new --help<\/pre>\n\n\n\n<p>Now  I can re-run the <code>dotnet new<\/code> command:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1,2,11\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">PS > dotnet new classlib -f netcoreapp3.0 -o HelloWorldCore\nThe template \"Class library\" was created successfully.\n\nProcessing post-creation actions...\nRunning 'dotnet restore' on HelloWorldCore\\HelloWorldCore.csproj...\n  Restore completed in 70.99 ms for C:\\Users\\carlo\\Git\\HelloWorldCore\\HelloWorldCore.csproj.\n\nRestore succeeded.\n\n\nPS > Get-ChildItem -Recurse\n\n    Directory: C:\\Users\\carlo\\Git\\HelloWorldCore\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\nd----           8\/19\/2019  4:59 PM                bin\nd----           8\/19\/2019  4:59 PM                obj\n-a---           8\/19\/2019  4:44 PM             91 Class1.cs\n-a---           8\/19\/2019  4:44 PM            144 HelloWorldCore.csproj\n\n    Directory: C:\\Users\\carlo\\Git\\HelloWorldCore\\bin\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\nd----           8\/19\/2019  4:59 PM                Debug\n\n    Directory: C:\\Users\\carlo\\Git\\HelloWorldCore\\bin\\Debug\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\nd----           8\/19\/2019  4:59 PM                netcoreapp3.0\n\n    Directory: C:\\Users\\carlo\\Git\\HelloWorldCore\\obj\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\nd----           8\/19\/2019  4:59 PM                Debug\n-a---           8\/19\/2019  4:44 PM            149 HelloWorldCore.csproj.nuget.cache\n-a---           8\/19\/2019  4:44 PM           2253 HelloWorldCore.csproj.nuget.dgspec.json\n-a---           8\/19\/2019  4:44 PM           1166 HelloWorldCore.csproj.nuget.g.props\n-a---           8\/19\/2019  4:44 PM            294 HelloWorldCore.csproj.nuget.g.targets\n-a---           8\/19\/2019  4:44 PM           2268 project.assets.json\n\n    Directory: C:\\Users\\carlo\\Git\\HelloWorldCore\\obj\\Debug\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\nd----           8\/19\/2019  4:59 PM                netcoreapp3.0\n\n    Directory: C:\\Users\\carlo\\Git\\HelloWorldCore\\obj\\Debug\\netcoreapp3.0\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\n-a---           8\/19\/2019  4:59 PM           1015 HelloWorldCore.AssemblyInfo.cs\n-a---           8\/19\/2019  4:59 PM             42 HelloWorldCore.AssemblyInfoInputs.cache\n-a---           8\/19\/2019  4:59 PM            188 HelloWorldCore.assets.cache\n-a---           8\/19\/2019  4:59 PM             42 HelloWorldCore.csproj.CoreCompileInputs.cache\n-a---           8\/19\/2019  4:59 PM         109810 HelloWorldCore.csprojAssemblyReference.cache\n<\/pre>\n\n\n\n<p>Even with .NET Core I still need to add a reference to the <code>System.Management.Automation<\/code> assembly, which is available as a <code>nuget<\/code> package. Visual Studio Code has a thriving marketplace with tons of very useful extension so I decided to check if something was available to help with this scenario and sure enough I found a number of suitable extensions. I went for <a rel=\"noreferrer noopener\" aria-label=\"NuGet Package Manager (opens in a new tab)\" href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=jmrog.vscode-nuget-package-manager\" target=\"_blank\">NuGet Package Manager<\/a> and I added a reference to <code> System.Management.Automation<\/code> version 6.2.2 to match my .NET Core version<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1480\" style=\"aspect-ratio: 2508 \/ 1480;\" width=\"2508\" autoplay controls loop preload=\"auto\" src=\"https:\/\/www.cloudnotes.io\/wp-content\/uploads\/2019\/08\/2019-08-19-22-34-17.mp4\"><\/video><figcaption>add nuget package<\/figcaption><\/figure>\n\n\n\n<p>Now I can import the <code>System.Management.Automation<\/code> namespace, decorate the class with the <code>Cmdlet<\/code> attribute, have it inherit from <code>Cmdlet<\/code> and override the <code>ProcessRecord()<\/code> method; for this sample I don&#8217;t need to be too fancy with my code so here it is:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System.Management.Automation;\n\nnamespace HelloWorldCore\n{\n    [Cmdlet(VerbsCommon.Get, \"HelloWorld\")]\n    public class Class1 : Cmdlet\n    {\n        private string _name;\n        [Parameter(Mandatory = true)]\n        public string Name\n        {\n            get { return _name; }\n            set { _name = value; }\n        }\n\n        protected override void ProcessRecord()\n        {\n            WriteObject(\"Hey \" + this.Name);\n        }\n    }\n}<\/pre>\n\n\n\n<p>Next step, build the project and generate the .dll I will later import in my Powershell session; to do that I could use <code>dotnet<\/code> at the command line or use a VSCode extension such as <a rel=\"noreferrer noopener\" aria-label=\"Dotnet core commands (opens in a new tab)\" href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=matijarmk.dotnet-core-commands\" target=\"_blank\">Dotnet core commands<\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">PS > dotnet build --configuration Debug\nMicrosoft (R) Build Engine version 16.3.0-preview-19377-01+dd8019d9e for .NET Core\nCopyright (C) Microsoft Corporation. All rights reserved.\n\n  Restore completed in 1.63 sec for C:\\Users\\carlo\\Git\\HelloWorldCore\\HelloWorldCore.csproj.\n  You are using a preview version of .NET Core. See: https:\/\/aka.ms\/dotnet-core-preview\n  HelloWorldCore -> C:\\Users\\carlo\\Git\\HelloWorldCore\\bin\\Debug\\netcoreapp3.0\\HelloWorldCore.dll\n\nBuild succeeded.\n    0 Warning(s)\n    0 Error(s)\n\nTime Elapsed 00:00:02.76<\/pre>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1480\" style=\"aspect-ratio: 2508 \/ 1480;\" width=\"2508\" autoplay controls loop src=\"https:\/\/www.cloudnotes.io\/wp-content\/uploads\/2019\/08\/2019-08-20-21-25-57.mp4\"><\/video><figcaption>build project<\/figcaption><\/figure>\n\n\n\n<p>Finally, these are a few pointers to get started building binary Powershell modules<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" aria-label=\"Tutorials for Writing Cmdlets (opens in a new tab)\" href=\"https:\/\/docs.microsoft.com\/en-us\/powershell\/developer\/cmdlet\/tutorials-for-writing-cmdlets\" target=\"_blank\">Tutorials for Writing Cmdlets<\/a><\/li><li><a rel=\"noreferrer noopener\" aria-label=\"Examples of Cmdlets Code (opens in a new tab)\" href=\"https:\/\/docs.microsoft.com\/en-us\/powershell\/developer\/cmdlet\/examples-of-cmdlet-code\" target=\"_blank\">Examples of Cmdlets Code<\/a><\/li><li> <a rel=\"noreferrer noopener\" href=\"https:\/\/www.red-gate.com\/simple-talk\/dotnet\/net-development\/using-c-to-create-powershell-cmdlets-the-basics\/\" target=\"_blank\">Using C# to Create PowerShell Cmdlets: The Basics<\/a> <\/li><li><a rel=\"noreferrer noopener\" aria-label=\"Writing a PowerShell module in C# (opens in a new tab)\" href=\"https:\/\/www.powershellmagazine.com\/2014\/03\/18\/writing-a-powershell-module-in-c-part-1-the-basics\/\" target=\"_blank\">Writing a PowerShell module in C#<\/a><\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td><em>You cannot help men permanently by doing for them what they could and should do for themselves. &#8211;  <\/em><a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"http:\/\/quotes4all.net\/abraham-lincoln-quotes\" target=\"_blank\"><em>Abraham Lincoln<\/em><\/a><\/td><\/tr><\/tbody><\/table>\n","protected":false},"excerpt":{"rendered":"<p>I wrote countless scripts and a good amount of modules (and functions) in my years as Service Engineer but all of them are script modules, I never really created binary modules. The main reason is that I like to write in Powershell but I also like the fact that, not being a compiled language, it is very easy to share and modify the source code for a script module and it is immediately ready to be reloaded and used. Anyway out of curiosity and to learn a different approach to building modules, I decided to try to convert one of mine from script to binary; my first step was (of course) a quick search to find some samples and getting started articles and I found a few good ones (referenced below) but all of them use Visual Studio and the full version of the .NET Framework, while I want to use Visual Studio Code and .NET Core. So here&#8217;s what I came up with. First off of course I need .NET Core (I am using the latest .NET Core 3 preview 8 at the moment), Visual Studio Code and the C# Extension. Next, I&#8217;m going to create a Class Library project using dotnet at the command line; note the -f parameter to indicate the framework version I want to use: Since I am attempting this command on a fresh installation I am missing some templates but luckily dotnet suggests the command to run to fix this problem: Now I can re-run the dotnet new command: Even with .NET Core I still need to add a reference to the System.Management.Automation assembly, which is available as a nuget package. Visual Studio Code has a thriving marketplace with tons of very useful extension so I decided to check if something was available to help with this scenario and sure enough I found a number of suitable extensions. I went for NuGet Package Manager and I added a reference to System.Management.Automation version 6.2.2 to match my .NET Core version Now I can import the System.Management.Automation namespace, decorate the class with the Cmdlet attribute, have it inherit from Cmdlet and override the ProcessRecord() method; for this sample I don&#8217;t need to be too fancy with my code so here it is: Next step, build the project and generate the .dll I will later import in my Powershell session; to do that I could use dotnet at the command line or use a VSCode extension such as Dotnet core commands Finally, these are a few pointers to get started building binary Powershell modules Tutorials for Writing Cmdlets Examples of Cmdlets Code Using C# to Create PowerShell Cmdlets: The Basics Writing a PowerShell module in C# You cannot help men permanently by doing for them what they could and should do for themselves. &#8211; Abraham Lincoln<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[63,62,35,60],"tags":[65,40,64],"class_list":["post-4847","post","type-post","status-publish","format-standard","hentry","category-net-core","category-dotnet","category-powershell","category-vscode","tag-net-core","tag-powershell","tag-vscode"],"author_meta":{"display_name":"carloc","author_link":"https:\/\/www.cloudnotes.io\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"savona-slider-full-thumbnail":false,"savona-slider-grid-thumbnail":false,"savona-full-thumbnail":false,"savona-grid-thumbnail":false,"savona-single-navigation":false},"uagb_author_info":{"display_name":"carloc","author_link":"https:\/\/www.cloudnotes.io\/author\/admin\/"},"uagb_comment_info":0,"uagb_excerpt":"I wrote countless scripts and a good amount of modules (and functions) in my years as Service Engineer but all of them are script modules, I never really created binary modules. The main reason is that I like to write in Powershell but I also like the fact that, not being a compiled language, it&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/www.cloudnotes.io\/category\/net-core\/\" class=\"advgb-post-tax-term\">.NET Core<\/a>","<a href=\"https:\/\/www.cloudnotes.io\/category\/dotnet\/\" class=\"advgb-post-tax-term\">dotNet<\/a>","<a href=\"https:\/\/www.cloudnotes.io\/category\/powershell\/\" class=\"advgb-post-tax-term\">Powershell<\/a>","<a href=\"https:\/\/www.cloudnotes.io\/category\/vscode\/\" class=\"advgb-post-tax-term\">VSCode<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">.NET Core<\/span>","<span class=\"advgb-post-tax-term\">dotNet<\/span>","<span class=\"advgb-post-tax-term\">Powershell<\/span>","<span class=\"advgb-post-tax-term\">VSCode<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/www.cloudnotes.io\/category\/vscode\/\" class=\"advgb-post-tax-term\">.net core<\/a>","<a href=\"https:\/\/www.cloudnotes.io\/category\/vscode\/\" class=\"advgb-post-tax-term\">Powershell<\/a>","<a href=\"https:\/\/www.cloudnotes.io\/category\/vscode\/\" class=\"advgb-post-tax-term\">vscode<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">.net core<\/span>","<span class=\"advgb-post-tax-term\">Powershell<\/span>","<span class=\"advgb-post-tax-term\">vscode<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 7 years ago","modified":"Updated 7 years ago"},"absolute_dates":{"created":"Posted on August 20, 2019","modified":"Updated on August 24, 2019"},"absolute_dates_time":{"created":"Posted on August 20, 2019 10:34 pm","modified":"Updated on August 24, 2019 4:26 pm"},"featured_img_caption":"","series_order":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/paQTEh-1gb","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.cloudnotes.io\/wp-json\/wp\/v2\/posts\/4847","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cloudnotes.io\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cloudnotes.io\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cloudnotes.io\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cloudnotes.io\/wp-json\/wp\/v2\/comments?post=4847"}],"version-history":[{"count":20,"href":"https:\/\/www.cloudnotes.io\/wp-json\/wp\/v2\/posts\/4847\/revisions"}],"predecessor-version":[{"id":4871,"href":"https:\/\/www.cloudnotes.io\/wp-json\/wp\/v2\/posts\/4847\/revisions\/4871"}],"wp:attachment":[{"href":"https:\/\/www.cloudnotes.io\/wp-json\/wp\/v2\/media?parent=4847"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cloudnotes.io\/wp-json\/wp\/v2\/categories?post=4847"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cloudnotes.io\/wp-json\/wp\/v2\/tags?post=4847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}