Visual Studio项目模板在外部目录中创建解决方案文件

时间:2014-12-31 06:45:48

标签: visual-studio templates project projects-and-solutions

我正在使用VSTemplate为Visual Studio创建多项目模板。

我是项目模板的新手,并引用此url为Visual Studio创建多项目模板。

<VSTemplate Version="2.0.0" Type="ProjectGroup"
    xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
  <TemplateData>
    <Name>MVC with Repo and UoW</Name>
    <Description>Basic by Jenish</Description>
    <Icon>Icon.ico</Icon>
    <ProjectType>CSharp</ProjectType>
    <ProjectSubType>
    </ProjectSubType>
    <SortOrder>1000</SortOrder>
    <CreateNewFolder>false</CreateNewFolder>
    <DefaultName>MVC</DefaultName>
    <ProvideDefaultName>true</ProvideDefaultName>
    <LocationField>Enabled</LocationField>
    <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
  </TemplateData>
  <TemplateContent>
    <ProjectCollection>

          <ProjectTemplateLink ProjectName="$safeprojectname$.Common">
            KLS.Common\MyTemplate.vstemplate
          </ProjectTemplateLink>



          <ProjectTemplateLink ProjectName="$safeprojectname$.Data.Contract">
            KLS.Data.Contract\MyTemplate.vstemplate
          </ProjectTemplateLink>
          <ProjectTemplateLink ProjectName="$safeprojectname$.Data.Repositories">
            KLS.Data.Repositories\MyTemplate.vstemplate
          </ProjectTemplateLink>



          <ProjectTemplateLink ProjectName="$safeprojectname$.Manager">
            KLS.Manager\MyTemplate.vstemplate
          </ProjectTemplateLink>



          <ProjectTemplateLink ProjectName="$safeprojectname$.Models">
            KLS.Models\MyTemplate.vstemplate
          </ProjectTemplateLink>


      <ProjectTemplateLink ProjectName="$safeprojectname$.Web">
        KLSFoods\MyTemplate.vstemplate
      </ProjectTemplateLink>

    </ProjectCollection>
  </TemplateContent>
  <WizardExtension>
    <Assembly>RestTemplateWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c9a76f51a8a9555f</Assembly>
    <FullClassName>RestTemplateWizard.RootWizard</FullClassName>
  </WizardExtension>
</VSTemplate>

截图1:

enter image description here

按照上面的屏幕截图,Mytemplate.vstemplate是主根文件,除了包之外的所有文件夹都包含每个项目的单独vstemplate文件。

现在问题是我想要在第一个屏幕截图中显示相同的结构,但它在外部目录中生成解决方案。有没有什么办法可以强制模板按照屏幕截图创建解决方案。

模板目前正在生成这样的解决方案。

截屏2:

enter image description here

Mvc1将保存所有项目文件夹,我想要的是创建解决方案文件,其中定义了所有项目文件夹。因为目前它错误地引用了packages文件夹

提前致谢。

4 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我的解决方法是编辑解决方案文件(* .sln)并将文件移动到预期的文件夹中。

这是模板生成的文件夹结构(不是我期望的):

我的解决方案文件夹:

注意.sln文件不在项目的同一文件夹中

enter image description here

文件夹DDD_Backend10xxxx,包含所有项目:

enter image description here

步骤1:将.sln文件移动到包含所有项目的子文件夹中(根据项目的工作要求):

enter image description here

*。sln文件移动到与其他项目相同的文件夹

enter image description here

.sln文件现在包含项目文件夹,并且位于正确的解决方案文件夹级别。

第2步:打开并编辑.sln文件并修改所有项目的路径:

  • 未编辑导致错误的路径:

项目(“{2150E333-8FDC-42A3-9474-1A3956D46DE8}”)=“BusinessLayer”,“ DDD_Backend10xxxx \ BusinessLayer”,“{F9E1B70C-F692-414B-97C6-BCEC22F6C1F3}” EndProject

项目(“{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}”)=“BusinessLayer”,“ DDD_Backend10xxxx \ BusinessLayer \ BusinessLayer.csproj”,“{0CF94CF4-97C6-4079-8F60 -672CBE9B77D5}” EndProject

//其他项目参考......

  • 修正已修改的路径:从路径中删除文件夹“DDD_Backend10xxxx”

项目(“{2150E333-8FDC-42A3-9474-1A3956D46DE8}”)=“BusinessLayer”,“BusinessLayer”,“{F9E1B70C-F692-414B-97C6-BCEC22F6C1F3}” EndProject

项目(“{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}”)=“BusinessLayer”,“BusinessLayer \ BusinessLayer.csproj”,“{0CF94CF4-97C6-4079-8F60-672CBE9B77D5}” EndProject

//其他项目参考......

步骤3:修改主/根项目root_project_name.csproj文件,以获取nuget扩展参考路径。 修改对packages文件夹的任何引用,以便它们引用同一文件夹级别的packages文件夹。 即

来自:Import Project =“ .... \ packages \ Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1

于: 导入项目=“ .. \ packages \ Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1

这是nuget包更新或安装的重要参考。

enter image description here

第4步:运行nuget更新/恢复软件包。 一旦nuget更新/恢复包,将在正确的文件夹级别创建“packages”文件夹。 (在程序包管理器控制台窗口中运行命令 update-package -reinstall 。)

答案 1 :(得分:0)

晚了3年,但这可能对其他人有所帮助。

1)在向导类中声明一个DTE字段,并在此字段中将automationObject参数保存到RunStarted(...):

public class MyWizard : IWizard
{
    DTE dte;
    ...


    public void RunStarted( object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams )
    {
        dte = automationObject as DTE;

        ...

2)在RunFinished中,使用dte对象将解决方案保存在任何地方:

    public void RunFinished()
    {
        if( dte != null )
        {
            var solution = dte.Solution;
            var path = <whatever path you want>;
            solution.SaveAs( path );
        }
        ...

您可能想要在RunStarted中检查replacementsDictionary的内容并使用其中的一个值;例如,您可以使用$ destinationdirectory $条目构建解决方案文件的路径(我正在使用该路径)。

答案 2 :(得分:0)

代替移动.sln文件然后对其进行编辑,只需对解决方案执行“另存为...”,然后将其放在与项目相同的目录中即可。然后,您可以删除原始的.sln文件。 Visual Studio将调整新.sln文件中的所有路径,以匹配您放置它的位置。

答案 3 :(得分:-2)

这对我来说是正确的。如果你查看你提供的URL中的文档,听起来这是正常的。

解决方案应与项目文件夹位于同一目录中。如果你看一下screenshot1,那似乎就是这样。在您的示例中,您似乎只创建了一个名为MVC1的项目,这是一个名为MVC1的解决方案中唯一的项目。您提供的代码段也与屏幕截图2不匹配。您可能还希望包含您实际用于生成解决方案的模板文件。