编辑:VS2017 15.6添加了一个官方的新项目CMake向导
具有
version 15.6
这创建了一个简单的
ninja
基于C++的“Hello CMake”项目。
你的问题和现有向导的缺乏启发了我写一个。这是一个非常基本的设置,如果在编写Visual Studio扩展方面有更多经验的人能够提供帮助,那么它肯定会受益匪浅,但具体如下:
https://github.com/FloriansGit/VSCMakeWizards
编辑
https://marketplace.visualstudio.com/items?itemName=oOFlorianOo.CMakeProjectWizards
重新启动Visual Studio 2017后,新的“CMake可执行模板”将显示在“File/new/Project/Visual C++”下:
它在给定文件夹中生成以下文件,然后在其上使用“打开文件夹”:
CMakeLists.txt
CMakeSettings.json
MyProject1.cpp
下一步
接下来可能采取的步骤是:
-
为一些基本项目/编译器设置添加交互式向导对话框
-
还添加一个项目向导,以便能够将源文件添加到
CMakeLists.txt
我期待收到关于基本想法的反馈。请将任何请求直接添加到:
https://github.com/FloriansGit/VSCMakeWizards/issues
代码
以下是向导的基本/初始代码作为参考:
WizardImplementationClass。反恐精英
// Based on https://docs.microsoft.com/en-us/visualstudio/extensibility/how-to-use-wizards-with-project-templates
// and https://stackoverflow.com/questions/3882764/issue-with-visual-studio-template-directory-creation
using System;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using EnvDTE;
using Microsoft.VisualStudio.TemplateWizard;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using EnvDTE80;
namespace VSCMakeWizards
{
public class WizardImplementation : IWizard
{
public void RunStarted(object automationObject,
Dictionary<string, string> replacementsDictionary,
WizardRunKind runKind, object[] customParams)
{
var destinationDir = replacementsDictionary["$destinationdirectory$"];
var desiredNamespace = replacementsDictionary["$safeprojectname$"];
var templatePath = Path.GetDirectoryName((string)customParams[0]);
var dte = automationObject as DTE2;
var solution = dte.Solution as EnvDTE100.Solution4;
if (solution.IsOpen)
{
solution.Close();
}
File.Copy(Path.Combine(templatePath, "CMakeSettings.json"), Path.Combine(destinationDir, "CMakeSettings.json"));
File.Copy(Path.Combine(templatePath, "main.cpp"), Path.Combine(destinationDir, desiredNamespace + ".cpp"));
// see https://stackoverflow.com/questions/1231768/c-sharp-string-replace-with-dictionary
Regex re = new Regex(@"(\$\w+\$)", RegexOptions.Compiled);
string input = File.ReadAllText(Path.Combine(templatePath, "CMakeLists.txt"));
string output = re.Replace(input, match => replacementsDictionary[match.Groups[1].Value]);
File.WriteAllText(Path.Combine(destinationDir, "CMakeLists.txt"), output);
var vsSolution = Package.GetGlobalService(typeof(SVsSolution)) as IVsSolution7;
if (vsSolution != null)
{
vsSolution.OpenFolder(destinationDir);
}
throw new WizardCancelledException();
}
// This method is called before opening any item that
// has the OpenInEditor attribute.
public void BeforeOpeningFile(ProjectItem projectItem)
{
}
public void ProjectFinishedGenerating(Project project)
{
}
// This method is only called for item templates,
// not for project templates.
public void ProjectItemFinishedGenerating(ProjectItem
projectItem)
{
}
// This method is called after the project is created.
public void RunFinished()
{
}
// This method is only called for item templates,
// not for project templates.
public bool ShouldAddProjectItem(string filePath)
{
return false;
}
}
}
笔记
:The
WizardCancelledException
是必要的,因为Visual Studio会尝试生成/打开实际的解决方案。尚不支持“打开文件夹”类型的项目向导(没有用于此的SDK API)。
工具书类