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

8

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

我对项目模板还不熟悉,参考了这个链接来为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是主根文件,除了packages文件夹外的所有文件夹都包含单独的vstemplate文件。

现在的问题是我希望生成与第一张屏幕截图相同的结构,但它会在外部目录中生成解决方案。是否有任何方法可以强制模板按照屏幕截图1的方式创建解决方案。

当前模板生成的解决方案如下所示。

截图2:

enter image description here

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

提前致谢。


大约一年前,我也遇到了同样的问题。我找到的最好的讨论是这个。就我个人而言,我放弃了创建多个项目模板。至少目前是这样。 - Daniil Veriga
这个问题有新的信息吗? - Dominic Jonas
@DominicJonas 不是。那是我开始的额外工作,但由于这个问题我离开了它。 - Jenish Rabadiya
@JenishRabadiya 我也遇到了同样的问题,你是怎么解决的? - Carlo Luther
@JenishRabadiya 请检查我的答案。 - Carlo Luther
显示剩余3条评论
4个回答

1

虽然晚了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$条目构建到解决方案文件的路径(我正在使用该条目)。

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文件,修改所有项目的路径:

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

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

Project("{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

//其他项目引用...

步骤三:修改主/根项目root_project_name.csproj文件,用于nuget扩展引用路径。 修改任何对packages文件夹的引用,使它们引用同一级别的packages文件夹。 例如:

从:Import Project="....\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1

到: Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1

这是nuget包更新或安装的必要引用。

enter image description here

步骤4:运行NuGet更新/还原包。 一旦NuGet更新/还原包,将在正确的文件夹级别中创建一个“packages”文件夹。 (在“包管理器控制台”窗口中运行命令update-package -reinstall。)


1
谢谢你的回答。我已经考虑过这种解决问题的方法,但我想让它完全自动化,而这个解决方案需要手动更改sln文件。 - Jenish Rabadiya

0

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


-2

在我看来,那看起来是正确的。如果你查看你提供的URL中的文档,它听起来像是这样工作的。

解决方案应该位于与项目文件夹相同的目录中。如果你看一下截图1,似乎就是这种情况。在你的示例中,你只创建了一个名为MVC1的项目,它是名为MVC1的解决方案中唯一的项目。你提供的代码片段也与截图2不匹配。你可能还想包括你实际使用来生成解决方案的模板文件。


不,我并不是只创建了一个名为MVC1的项目。截图1中的所有项目都在截图2中MVC1文件夹内。这样说清楚了吗?我提供的xml文件是将所有项目分组的文件。 - Jenish Rabadiya
3
显然你没有认真阅读问题。楼主的意思是有一个额外的文件夹被创建了,但这并没有反映在vstemplate文件中。 - Konstantin Chernov
啊,我误解了。对不起! - Mothbawls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接