Visual Studio扩展:带有架构项模板的Json

时间:2017-07-06 13:49:23

标签: visual-studio vsix

我想创建一个Visual Studio扩展,以允许用户创建一个json文件并自动为其应用自定义JSON模式。我跟着this article,到目前为止,我成功地允许用户创建JSON文件,但我不知道如何自动将自定义模式绑定到它。

我希望这个架构在扩展解决方案中,这样,当我更新扩展时,架构会更新。当我使用SideWaffle时,我注意到有这个" JSON Schema Selector Extension"项目模板,但它不起作用。它需要" Microsoft.Json.Core.Schema"无处可寻(甚至在Microsoft.JSON Nuget包中也没有...)。

1 个答案:

答案 0 :(得分:0)

这个问题很晚,但解决方案涉及引用自 VS2019 起的非 SDK VS 程序集(以及之前的所有内容)。为了证明它是非 SDK,它甚至在 VS2019 中更改了身份,它现在是 Microsoft.WebTools.Languages.Json 自 VS2019(而对于旧版本它确实是 Microsoft.Json.Core),当然,它可能会再次更改未来。

知道了这一点,如果你在网上搜索opensource repos,就会找到一些实现方法的思路参考。有些人在他们的 repo 中捆绑了 DLL 的副本(这可能违反了某些许可条款)。就我个人而言,我没有走那条路,而是选择了一条相对于 $(MSBuildToolsPath) 的过于复杂的路径:

    <Reference Include="Microsoft.WebTools.Languages.Json">
      <HintPath>$(MSBuildToolsPath)\..\..\..\Common7\IDE\Extensions\Microsoft\Web Tools\Languages\Microsoft.WebTools.Languages.Json.dll</HintPath>
      <SpecificVersion>False</SpecificVersion>
      <Private>false</Private>
    </Reference>

单看这个,很明显这种方法很脆弱,路径可能会在以后移动,但是它避免了引导dll。

无论如何,无论您选择以哪种方式引用程序集,至于其他来自 VS 本身的内容,请确保它是 Private=false,因为您不希望最终的 VSIX 包包含它。

>

那么简单的就是实现IJsonSchemaSelector了:

    [Export(typeof(IJsonSchemaSelector))]
    public class LaunchConfigJsonSchemaProvider : IJsonSchemaSelector
    {
        private static readonly string Schema = @"<somehow resolve your extension install path and find your schema json>";

        public event EventHandler AvailableSchemasChanged { add { } remove { } }

        public Task<IEnumerable<string>> GetAvailableSchemasAsync()
        {
            return Task.FromResult((IEnumerable<string>)new[] { Schema });
        }

        public string GetSchemaFor(string fileLocation)
        {
            string ext = Path.GetExtension(fileLocation);
            if (!".greatjson".Equals(ext, StringComparison.OrdinalIgnoreCase))
                return null;

            return Schema;
        }
    }