【问题标题】:Visual studio project template creating solution file in outer directoryVisual Studio 项目模板在外部目录中创建解决方案文件
【发布时间】:2014-12-31 06:45:48
【问题描述】:

我正在使用 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:

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

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

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

屏幕截图 2:

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

提前致谢。

【问题讨论】:

  • 大约一年前我遇到了同样的问题。我发现最好的讨论是this one。就个人而言,我放弃了创建多个项目模板。至少,目前是这样。
  • 你找到答案了吗?
  • @lordkain 不,我这样做是为了好玩。这不是正式任务,所以我把它放在一边。
  • @JenishRabadiya 谢谢你的回复!.. 这对我来说也是一个手动操作。干杯
  • 有关于这个问题的一些新信息吗?

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


【解决方案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$ 条目来构造解决方案文件的路径(我正在使用那个)。

【讨论】:

    【解决方案2】:

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

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

    我的解决方案文件夹:

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

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

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

    *.sln 文件与其余项目移至同一文件夹

    .sln 文件现在包含项目文件夹和正确的解决方案文件夹级别。

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

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

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

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

    //其他项目参考...

    • 修复编辑路径:从路径中删除文件夹“DDD_Backend10xxxx”

    Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BusinessLayer", "BusinessLayer", "{F9E1B70C-F692-414B-97C6-BCEC22F6C1F3}" 结束项目

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

    //其他项目参考...

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。我已经想过用这种方法来解决问题,但我想让它完全自动化,因为这个解决方案需要手动更改 sln 文件。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      解决方案应与项目文件夹位于同一目录中。如果您查看屏幕截图1,这似乎就是正在发生的事情。在您的示例中,您似乎只创建了一个名为 MVC1 的项目,这是名为 MVC1 的解决方案中的唯一项目。您提供的代码 sn-p 也与 screenshot2 不匹配。您可能还希望包含您实际用于生成解决方案的模板文件。

      【讨论】:

      • 不,我不是只创建一个项目 MVC1。截图 1 中的所有项目都在截图 2 的 MVC1 文件夹中。那有意义吗?我提供的 xml 是对所有项目进行分组的那个。
      • 好吧,你显然没有正确阅读这个问题。 threadstarter 的意思是创建了一个额外的文件夹,它没有反映在 vstemplate 文件中。
      • 啊,我误会了。很抱歉!
      猜你喜欢
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多