diff --git a/Kool.EditProject.sln b/Kool.EditProject.sln new file mode 100644 index 0000000..71479ff --- /dev/null +++ b/Kool.EditProject.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2020 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kool.EditProject", "Kool.EditProject\Kool.EditProject.csproj", "{52FBE367-4D6B-445D-A042-F4B2553F471F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{81143BF0-C559-4B59-860F-130543C2C504}" + ProjectSection(SolutionItems) = preProject + appveyor.yml = appveyor.yml + Readme.md = Readme.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {52FBE367-4D6B-445D-A042-F4B2553F471F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {52FBE367-4D6B-445D-A042-F4B2553F471F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52FBE367-4D6B-445D-A042-F4B2553F471F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {52FBE367-4D6B-445D-A042-F4B2553F471F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A86CB1E9-B0DF-42E1-834D-5687F30A8071} + EndGlobalSection +EndGlobal diff --git a/Kool.EditProject/EditProjectCommand.cs b/Kool.EditProject/EditProjectCommand.cs new file mode 100644 index 0000000..6644c92 --- /dev/null +++ b/Kool.EditProject/EditProjectCommand.cs @@ -0,0 +1,147 @@ +using EnvDTE; +using Microsoft.VisualStudio.Shell; +using System; +using System.Collections.Generic; +using System.ComponentModel.Design; +using System.IO; +using System.Linq; + +namespace Kool.EditProject +{ + internal sealed class EditProjectCommand + { + // Editing File - Source File + private static readonly Dictionary EditingFileMap = new Dictionary(); + + public static EditProjectCommand Instance { get; private set; } + + public static void Initialize(EditProjectPackage package) => Instance = new EditProjectCommand(package); + + // https://stackoverflow.com/questions/45795759/detect-a-dotnet-core-project-from-envdte-project-api + // https://www.codeproject.com/reference/720512/list-of-visual-studio-project-type-guids + private const string CS_CORE_PROJECT_KIND = "{9A19103F-16F7-4668-BE54-9A1E7A4F7556}"; + private const string FS_CORE_PROJECT_KIND = "{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}"; + private const string VB_CORE_PROJECT_KIND = "{778DAE3C-4631-46EA-AA77-85C1314464D9}"; + + private readonly EditProjectPackage _package; + private Events _dteEvents; + private DocumentEvents _documentEvents; + + private EditProjectCommand(EditProjectPackage package) + { + _package = package; + var menuCommandID = new CommandID(Guid.Parse(Ids.CMD_SET), Ids.EDIT_PROJECT_MENU_COMMAND_ID); + var menuCommand = new OleMenuCommand(ExecuteCommand, null, BeforeQueryStatus, menuCommandID); + _package.CommandService.AddCommand(menuCommand); + } + + private void BeforeQueryStatus(object sender, EventArgs e) + { + var command = sender as OleMenuCommand; + var project = _package.DTE.SelectedItems.Item(1).Project; + + switch (project.Kind) + { + case CS_CORE_PROJECT_KIND: + case FS_CORE_PROJECT_KIND: + case VB_CORE_PROJECT_KIND: + command.Visible = false; + break; + + default: + var projectName = Path.GetFileName(project.FullName); + command.Visible = true; + command.Text = string.Format(Resources.EditMenuPattern, projectName); + break; + } + } + + private void ExecuteCommand(object sender, EventArgs e) + { + var selectedFile = _package.DTE.SelectedItems.Item(1).Project.FullName; + + if (EditingFileMap.ContainsValue(selectedFile)) + { + ActiveDocument(selectedFile); + return; + } + + if (EditingFileMap.Count == 0) + { + RegisterListeners(); + } + + var editingFile = CreateFileForEditing(selectedFile); + EditingFileMap.Add(editingFile, selectedFile); + OpenDocument(editingFile); + } + + private string CreateFileForEditing(string selectedFile) + { + var path = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + Directory.CreateDirectory(path); // Ensure temp path exists. + var file = Path.Combine(path, Path.GetFileName(selectedFile)); + File.Copy(selectedFile, file, true); + return file; + } + + private void OpenDocument(string file) => VsShellUtilities.OpenDocument(_package, file); + + private void ActiveDocument(string selectedFile) + { + var editingFile = EditingFileMap.Single(x => x.Value == selectedFile).Key; + + foreach (Document document in _package.DTE.Documents) + { + if (document.FullName == editingFile) + { + document.Activate(); + } + } + } + + private void RegisterListeners() + { + _dteEvents = _package.DTE.Events; // Prevent it from GC. + _documentEvents = _dteEvents.DocumentEvents; // Prevent it from GC. + + _documentEvents.DocumentSaved += DocumentEvents_DocumentSaved; + _documentEvents.DocumentClosing += DocumentEvents_DocumentClosing; + } + + private void RemoveListeners() + { + _documentEvents.DocumentSaved -= DocumentEvents_DocumentSaved; + _documentEvents.DocumentClosing -= DocumentEvents_DocumentClosing; + + _dteEvents = null; + _documentEvents = null; + } + + private void DocumentEvents_DocumentClosing(Document document) + { + var closingFile = document.FullName; + + if (EditingFileMap.ContainsKey(closingFile)) + { + EditingFileMap.Remove(closingFile); + Directory.Delete(Path.GetDirectoryName(closingFile), true); + } + + if (EditingFileMap.Count == 0) + { + RemoveListeners(); + } + } + + private void DocumentEvents_DocumentSaved(Document document) + { + var savedFile = document.FullName; + + if (EditingFileMap.TryGetValue(savedFile, out var sourceFile)) + { + File.Copy(savedFile, sourceFile, true); + } + } + } +} \ No newline at end of file diff --git a/Kool.EditProject/EditProjectPackage.cs b/Kool.EditProject/EditProjectPackage.cs new file mode 100644 index 0000000..f66378e --- /dev/null +++ b/Kool.EditProject/EditProjectPackage.cs @@ -0,0 +1,30 @@ +using EnvDTE80; +using Microsoft.VisualStudio.Shell; +using System; +using System.ComponentModel.Design; +using System.Runtime.InteropServices; + +namespace Kool.EditProject +{ + [Guid(Ids.PACKAGE)] + [PackageRegistration(UseManagedResourcesOnly = true)] + [InstalledProductRegistration("#110", "#112", Vsix.VERSION, IconResourceID = 400)] + [ProvideMenuResource("Menus.ctmenu", 1)] + [ProvideAutoLoad(Microsoft.VisualStudio.VSConstants.UICONTEXT.ShellInitialized_string)] + public sealed class EditProjectPackage : Package + { + internal DTE2 DTE { get; private set; } + + internal OleMenuCommandService CommandService { get; private set; } + + protected override void Initialize() + { + base.Initialize(); + + DTE = GetService(typeof(EnvDTE.DTE)) as DTE2; + CommandService = GetService(typeof(IMenuCommandService)) as OleMenuCommandService; + + EditProjectCommand.Initialize(this); + } + } +} \ No newline at end of file diff --git a/Kool.EditProject/EditProjectPackage.en-US.vsct b/Kool.EditProject/EditProjectPackage.en-US.vsct new file mode 100644 index 0000000..25b4d63 --- /dev/null +++ b/Kool.EditProject/EditProjectPackage.en-US.vsct @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Kool.EditProject/EditProjectPackage.zh-CN.vsct b/Kool.EditProject/EditProjectPackage.zh-CN.vsct new file mode 100644 index 0000000..c48eb9c --- /dev/null +++ b/Kool.EditProject/EditProjectPackage.zh-CN.vsct @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Kool.EditProject/Ids.cs b/Kool.EditProject/Ids.cs new file mode 100644 index 0000000..3907c13 --- /dev/null +++ b/Kool.EditProject/Ids.cs @@ -0,0 +1,10 @@ +namespace Kool.EditProject +{ + internal static class Ids + { + public const string PACKAGE = "08a2610d-b354-402c-99a8-9c2113e89ad8"; + public const string CMD_SET = "6c7e3ed8-7da3-456d-802f-e11c4f8f8438"; + + public const int EDIT_PROJECT_MENU_COMMAND_ID = 0x0100; + } +} \ No newline at end of file diff --git a/Kool.EditProject/Key.snk b/Kool.EditProject/Key.snk new file mode 100644 index 0000000..a9b7af9 Binary files /dev/null and b/Kool.EditProject/Key.snk differ diff --git a/Kool.EditProject/Kool.EditProject.csproj b/Kool.EditProject/Kool.EditProject.csproj new file mode 100644 index 0000000..03e0ebc --- /dev/null +++ b/Kool.EditProject/Kool.EditProject.csproj @@ -0,0 +1,218 @@ + + + + + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + true + true + Key.snk + + + + Debug + AnyCPU + 2.0 + {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {52FBE367-4D6B-445D-A042-F4B2553F471F} + Library + Properties + Kool.EditProject + Kool.EditProject + v4.5 + true + true + true + true + true + false + Program + $(DevEnvDir)devenv.exe + /rootsuffix Exp + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + Designer + + + + + False + False + + + False + False + + + False + False + + + False + False + + + + False + False + + + ..\packages\Microsoft.VisualStudio.Imaging.14.3.25407\lib\net45\Microsoft.VisualStudio.Imaging.dll + False + + + ..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6071\lib\Microsoft.VisualStudio.OLE.Interop.dll + False + + + ..\packages\Microsoft.VisualStudio.Shell.14.0.14.3.25407\lib\Microsoft.VisualStudio.Shell.14.0.dll + False + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.10.0.10.0.30319\lib\net40\Microsoft.VisualStudio.Shell.Immutable.10.0.dll + False + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.11.0.11.0.50727\lib\net45\Microsoft.VisualStudio.Shell.Immutable.11.0.dll + False + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.12.0.12.0.21003\lib\net45\Microsoft.VisualStudio.Shell.Immutable.12.0.dll + False + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.14.0.14.3.25407\lib\net45\Microsoft.VisualStudio.Shell.Immutable.14.0.dll + False + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.7.10.6071\lib\Microsoft.VisualStudio.Shell.Interop.dll + False + + + False + ..\packages\Microsoft.VisualStudio.Shell.Interop.10.0.10.0.30319\lib\Microsoft.VisualStudio.Shell.Interop.10.0.dll + False + + + False + ..\packages\Microsoft.VisualStudio.Shell.Interop.11.0.11.0.61030\lib\Microsoft.VisualStudio.Shell.Interop.11.0.dll + False + + + False + ..\packages\Microsoft.VisualStudio.Shell.Interop.12.0.12.0.30110\lib\Microsoft.VisualStudio.Shell.Interop.12.0.dll + False + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.Shell.Interop.8.0.dll + False + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.9.0.9.0.30729\lib\Microsoft.VisualStudio.Shell.Interop.9.0.dll + False + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.7.10.6070\lib\Microsoft.VisualStudio.TextManager.Interop.dll + False + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.TextManager.Interop.8.0.dll + False + + + ..\packages\Microsoft.VisualStudio.Threading.14.1.131\lib\net45\Microsoft.VisualStudio.Threading.dll + False + + + ..\packages\Microsoft.VisualStudio.Utilities.14.3.25407\lib\net45\Microsoft.VisualStudio.Utilities.dll + False + + + ..\packages\Microsoft.VisualStudio.Validation.14.1.111\lib\net45\Microsoft.VisualStudio.Validation.dll + False + + + False + False + + + + + + + + + + + Menus.ctmenu + + + Menus.ctmenu + + + true + + + true + + + true + PreserveNewest + + + + + true + VSPackage.en-US.Resources + + + true + VSPackage.zh-CN.Resources + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + \ No newline at end of file diff --git a/Kool.EditProject/Properties/AssemblyInfo.cs b/Kool.EditProject/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..52e18c5 --- /dev/null +++ b/Kool.EditProject/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using Kool.EditProject; +using System.Reflection; +using System.Resources; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle(Vsix.PRODUCT + "." + Vsix.PACKAGE)] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct(Vsix.PRODUCT)] +[assembly: AssemblyCopyright(Vsix.URL)] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion(Vsix.VERSION)] + +// https://docs.microsoft.com/en-us/visualstudio/extensibility/localizing-menu-commands +[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] \ No newline at end of file diff --git a/Kool.EditProject/Resources.cs b/Kool.EditProject/Resources.cs new file mode 100644 index 0000000..d968e8f --- /dev/null +++ b/Kool.EditProject/Resources.cs @@ -0,0 +1,13 @@ +using System.Reflection; +using System.Resources; + +namespace Kool.EditProject +{ + internal static class Resources + { + private const string PACKAGE_RESX_FILE_NAME = "VSPackage"; + private static readonly ResourceManager Resx = new ResourceManager(PACKAGE_RESX_FILE_NAME, Assembly.GetExecutingAssembly()); + + public static string EditMenuPattern { get; } = Resx.GetString(nameof(EditMenuPattern)); + } +} \ No newline at end of file diff --git a/Kool.EditProject/Resources/Logo.ico b/Kool.EditProject/Resources/Logo.ico new file mode 100644 index 0000000..7319dec Binary files /dev/null and b/Kool.EditProject/Resources/Logo.ico differ diff --git a/Kool.EditProject/Resources/Preview.png b/Kool.EditProject/Resources/Preview.png new file mode 100644 index 0000000..cfdfa7b Binary files /dev/null and b/Kool.EditProject/Resources/Preview.png differ diff --git a/Kool.EditProject/VSPackage.en-US.resx b/Kool.EditProject/VSPackage.en-US.resx new file mode 100644 index 0000000..e771c27 --- /dev/null +++ b/Kool.EditProject/VSPackage.en-US.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Edit Project + + + An open sourced Visual Studio extension to add a context menu for editing project file. + + + + Resources\Logo.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Edit {0} + + \ No newline at end of file diff --git a/Kool.EditProject/VSPackage.zh-CN.resx b/Kool.EditProject/VSPackage.zh-CN.resx new file mode 100644 index 0000000..5a94985 --- /dev/null +++ b/Kool.EditProject/VSPackage.zh-CN.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Edit Project + + + 一个开源的 Visual Studio 拓展,在项目右键菜单中加入“编辑项目文件”的功能。 + + + + Resources\Logo.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + 编辑 {0} + + \ No newline at end of file diff --git a/Kool.EditProject/Vsix.cs b/Kool.EditProject/Vsix.cs new file mode 100644 index 0000000..dda27af --- /dev/null +++ b/Kool.EditProject/Vsix.cs @@ -0,0 +1,10 @@ +namespace Kool.EditProject +{ + internal static class Vsix + { + public const string VERSION = "0.9"; + public const string PRODUCT = "Kool"; + public const string PACKAGE = "Edit Project"; + public const string URL = "https://github.com/heku/kool.editproject"; + } +} \ No newline at end of file diff --git a/Kool.EditProject/packages.config b/Kool.EditProject/packages.config new file mode 100644 index 0000000..f468301 --- /dev/null +++ b/Kool.EditProject/packages.config @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Kool.EditProject/source.extension.vsixmanifest b/Kool.EditProject/source.extension.vsixmanifest new file mode 100644 index 0000000..1a1d6ad --- /dev/null +++ b/Kool.EditProject/source.extension.vsixmanifest @@ -0,0 +1,25 @@ + + + + + Edit Project + An open sourced Visual Studio extension to add a project context menu for editing project file. + https://github.com/heku/kool.editproject + Resources\Logo.ico + Resources\Preview.png + heku;kool;edit;project;proj;csproj + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Kool.EditProject/zh-CN/extension.vsixlangpack b/Kool.EditProject/zh-CN/extension.vsixlangpack new file mode 100644 index 0000000..e1de048 --- /dev/null +++ b/Kool.EditProject/zh-CN/extension.vsixlangpack @@ -0,0 +1,7 @@ + + + + Edit Project + 一个开源的 Visual Studio 拓展,在项目右键菜单中加入“编辑项目文件”的功能。 + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..93d9d34 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Heku + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..daaf0dd --- /dev/null +++ b/Readme.md @@ -0,0 +1,15 @@ +## About + +[![Build Status](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true)](https://ci.appveyor.com/project/heku/kool-editproject/branch/master) + +Edit Project is an open sourced Visual Studio extension to add a context menu for editing project file. + +You can download it via Visual Studio 2015/2017 'Extensions and Updates' or from the [marketplace](https://marketplace.visualstudio.com/items?itemName=iheku.EditProject). + +## Features +- Add **Edit Project File** menu for non-.NETCore projects. + + ![EditProjectPreview.png](Kool.EditProject/Resources/Preview.png) + +## License +- [MIT](LICENSE) diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..f19fb7a --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,26 @@ +version: 0.9.{build} +image: Visual Studio 2017 + +install: + - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex + +assembly_info: + patch: true + file: '**\AssemblyInfo.*' + assembly_version: '{version}' + assembly_file_version: '{version}' + assembly_informational_version: '{version}' + +before_build: + - nuget restore + - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion + - ps: Vsix-TokenReplacement Kool.EditProject\Vsix.cs 'VERSION = "([0-9\\.]+)"' 'VERSION = "{version}"' + +build_script: + - msbuild /p:configuration=Release /p:DeployExtension=false /p:ZipPackageCompressionLevel=normal /v:m + +after_build: + - ps: if ($env:APPVEYOR_REPO_BRANCH -eq 'master' -or $env:APPVEYOR_REPO_BRANCH -eq 'stable') { Vsix-PushArtifacts } + +test: off +deploy: off \ No newline at end of file