Есть ли способ использовать параметры в корневом файле шаблона при создании шаблона для нескольких проектов Visual Studio? - PullRequest
14 голосов
/ 29 июня 2009

Я пытаюсь создать шаблон для нескольких проектов. Я хочу, чтобы имена подпроектов содержали название решения. Я пробовал следующее, однако $ safeprojectName $ по какой-то причине не работает в корневом шаблоне. Он пытается создать папки с именем $ safeprojectName $ вместо фактического имени проекта.

<VSTemplate Version="2.0.0" Type="ProjectGroup"
  xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
  <TemplateData>
    <Name>Default Solution</Name>
    <Description>An example of a multi-project template</Description>
    <Icon>Icon.ico</Icon>
    <ProjectType>CSharp</ProjectType>
  </TemplateData>
  <TemplateContent>
    <ProjectCollection>
      <SolutionFolder Name="$safeprojectName$.Web">
        <ProjectTemplateLink ProjectName="$safeprojectName$.Web">
          Src\Web\MyTemplate.vstemplate
        </ProjectTemplateLink>
      </SolutionFolder>
    </ProjectCollection>
  </TemplateContent>
</VSTemplate>

Я много читал об этом и создал сборку, используя интерфейс IWizard, который создает параметр $ solutionName $. Затем я использовал следующий шаблон.

<VSTemplate Version="2.0.0" Type="ProjectGroup"
  xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
  <TemplateData>
    <Name>Default Solution</Name>
    <Description>An example of a multi-project template</Description>
    <Icon>Icon.ico</Icon>
    <ProjectType>CSharp</ProjectType>
  </TemplateData>
  <TemplateContent>
    <ProjectCollection>
      <SolutionFolder Name="$solutionName$.Web">
        <ProjectTemplateLink ProjectName="$solutionName$.Web">
          Src\Web\MyTemplate.vstemplate
        </ProjectTemplateLink>
      </SolutionFolder>
    </ProjectCollection>
  </TemplateContent>
  <WizardExtension>
    <Assembly>DefaultSoloutionWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=f753ddb61a28cb36, processorArchitecture=MSIL</Assembly>
    <FullClassName>DefaultSoloutionWizard.WizardImplementation</FullClassName>
  </WizardExtension>
</VSTemplate>

Это, однако, также не удается с той же проблемой. Я пытаюсь сделать невозможное? Любая помощь по этому вопросу будет приветствоваться.

Ответы [ 3 ]

5 голосов
/ 16 сентября 2014

Начиная с Visual Studio 2013, обновление 2, теперь вы можете использовать атрибут CopyParameters элемента ProjectTemplateLink в корневом файле .vstemplate. Все параметры, определенные в корневом шаблоне, будут доступны в связанных шаблонах с префиксом ext_.

Например, если корневой шаблон определяет параметр $ Foo $, то параметр $ ext_Foo $ будет доступен в связанных проектах с тем же значением.

Подробнее см. http://msdn.microsoft.com/en-us/library/ms171398.aspx.

2 голосов
/ 29 июня 2009

Возможно, вы захотите взглянуть на Инструментарий автоматизации навигации . Там достаточно много, чтобы переварить, но часть того, что он может сделать, это поместить интерфейс на основе мастера в многопроектный шаблон.

Если вы хотите увидеть пример этого, взгляните на Service Factory , которая может создать всю структуру решения, основанную частично на мастере.

1 голос
/ 18 января 2011

Да, вам нужно использовать статический словарь в мастере корневого шаблона, который будет использоваться мастером реализации дочерних шаблонов:

Реализация IWizard в корневом шаблоне

public void RunStarted(object automationObject,
        Dictionary<string, string> replacementsDictionary,
        WizardRunKind runKind, object[] customParams)
    {
        try
        {
            // Display a form to the user. The form collects 
            // input for the custom message.
            inputForm = new UserInputForm();
            inputForm.ShowDialog();

            customMessage = inputForm.get_CustomMessage();

            // Add custom parameters.
            replacementsDictionary.Add("$custommessage$",
                customMessage);
            globalDictionary = new Dictionary<string, string>();
            globalDictionary.Add("$custommessage$",
                customMessage);

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

    public static Dictionary<string, string> globalDictionary;

Вы можете получить полный пример реализации здесь: Многопроектные шаблоны с помощью мастера: Образец Visual Studio 2010

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...