Visual studio 项目模板替换了构建模板中的“$(SolutionDir)”宏

Visual studio project template replaces "$(SolutionDir)" macro in template on build

我正在尝试制作一个供内部使用的项目模板,其中包含我们程序集版本控制系统的所有自定义部分。

默认项目模板与我们的预构建和 post-build 事件完美配合,但是当我尝试使用 $(SolutionDir) 宏引用文件时,它在模板构建期间被替换和

<ItemGroup>
   <Compile Include="$(SolutionDir)\CommonAssemblyInfo.cs">
      <Link>Properties\CommonAssemblyInfo.cs</Link>
   </Compile>
   <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

在解决方案中使用项目模板生成项目时变成如下:

<ItemGroup>
   <Compile Include="..\..\..\..\..\Users\<username>\AppData\Local\Temp\n0u03z2x.gpe\CommonAssemblyInfo.cs">
     <Link>Properties\CommonAssemblyInfo.cs</Link>
   </Compile>
   <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

模板 build/package 进程可能正在替换它。

我该如何逃脱它?

Visual studio project template replaces “$(SolutionDir)” macro in template on build

你应该在导出的项目模板的.vstemplate文件中将CreateInPlace设置为true,如<CreateInPlace>true</CreateInPlace>.

以下是我的 .vstemplate 文件:

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
  <TemplateData>
    <Name>TestDemo</Name>
    <Description>&lt;No description available&gt;</Description>
    <ProjectType>CSharp</ProjectType>
    <ProjectSubType>
    </ProjectSubType>
    <SortOrder>1000</SortOrder>
    <CreateNewFolder>true</CreateNewFolder>
    <DefaultName>TestDemo</DefaultName>
    <ProvideDefaultName>true</ProvideDefaultName>
    <LocationField>Enabled</LocationField>
    <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
    <Icon>__TemplateIcon.ico</Icon>
    <CreateInPlace>true</CreateInPlace>
  </TemplateData>
  <TemplateContent>
    <Project TargetFileName="TestDemo.csproj" File="TestDemo.csproj" ReplaceParameters="true">
      <ProjectItem ReplaceParameters="true" TargetFileName="Class1.cs">Class1.cs</ProjectItem>
      <Folder Name="Properties" TargetFolderName="Properties">
        <ProjectItem ReplaceParameters="true" TargetFileName="AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
      </Folder>
    </Project>
  </TemplateContent>
</VSTemplate>

详细步骤:

  1. 导出项目模板不用自动将模板导入Visual Studio

  2. 解压缩导出的文件,将<CreateInPlace>true</CreateInPlace>添加到MyTemplate.vstemplate文件中,并压缩所有文件。

  3. 将此文件复制到文件夹:C:\Users\<Username>\Documents\Visual Studio 2017\Templates\ProjectTemplates

  4. 重新启动您的 Visual Studio,使用新的自定义模板创建一个新项目。

使用此设置,应该可以解决此问题。但奇怪的是,文档指出 CreateInPlace 的默认值为 true。

希望这对您有所帮助。