templates - 如何使用 .NET CLI 自定义模板获取项目名称的驼峰式版本

标签 templates dotnet-cli

我正在尝试为 dotnet CLI 创建一个模板项目,我需要更改项目名称的格式以进行一些替换。具体来说,我们领域内的约定使用项目名称的驼峰式版本作为需要存储在配置文件中的标识符。

通常情况下,模板执行看起来非常简单的搜索/替换模板项目名称到您使用 dotnet new 创建的项目的名称。此搜索区分大小写,因此它只会选择大小写完全相同的名称实例。

但是在我的例子中,我还需要它来匹配名称的驼峰式版本,并将其替换为新名称的驼峰式版本。这可能吗?

This reference有相当多的信息,this显示有参数生成器支持大小写转换,但是具体说不支持驼峰式大小写。我真正需要的是能够将第一个字符从大写更改为小写。

知道如何插入项目名称的驼峰式版本吗?

这里是我实验的大小写template.json和命令行参数,但是驼峰式外壳显然没有。

{
  "$schema": "http://json.schemastore.org/template",
  "identity": "TemplateTest.CSharp",
  "groupIdentity": "TemplateTest.Console",
  "author": "TemplateTest",
  "classifications": [ "Common", "Console" ],
  "name": "TemplateTest console template",
  "shortName": "test",
  "preferNameDirectory": true,
  "tags": {
    "language": "C#"
  },
  "sourceName": "TemplateTest",
  "symbols": {
    "apiname": {
      "type": "parameter",
      "datatype": "text",
      "defaultValue": "##FIX THIS##",
      "replaces": "templateTest"
    },
    "nameUpper": {
      "type": "generated",
      "generator": "casing",
      "parameters": {
        "source": "name",
        "toLower": false
      },
      "replaces": "TEMPLATETEST"
    },
    "nameLower": {
      "type": "generated",
      "generator": "casing",
      "parameters": {
        "source": "name",
        "toLower": true
      },
      "replaces": "templatetest"
    }
  }
}

最佳答案

拉取请求 #1723引入了一个(n as-yet undocumented)join 生成器。有了这个,还有未记录的derived symbols , 可以将项目名称拆分为[首字母]和[其余],将[首字母]转为小写,重新拼接。假设您从 PascalCase 开始,这将为您提供驼峰命名法。

define regexes which replace each individual uppercase letter 还有另一个选项.

下面,符号 temp1 将项目名称传递给自定义转换 lowerCaseFirstLetter,它本身是自定义转换 firstLetter小写。符号 temp2 通过转换 afterFirstLetter 传递名称。

firstLetterafterFirstLetter 使用相同的正则表达式将第一个字母捕获为 $1 并将其余字母捕获为 $2 , 但分别只返回第一个和第二个捕获组。

最后,符号apiname连接temp1temp2,并使用结果替换templateTest的实例在模板内容中。

"symbols": {
  "temp1": {
    "type": "derived",
    "valueSource": "name",
    "valueTransform": "lowerCaseFirstLetter"
  },
  "temp2": {
    "type": "derived",
    "valueSource": "name",
    "valueTransform": "afterFirstLetter"
  },
  "apiname": {
    "type": "generated",
    "generator": "join",
    "replaces": "templateTest",
    "parameters": {
      "symbols": [
        {
          "type": "ref",
          "value": "temp1"
        },
        {
          "type": "ref",
          "value": "temp2"
        }
      ]
    }
  }
},
"forms": {
  "lowerCaseFirstLetter": {
    "identifier": "chain",
    "steps": [
      "firstLetter",
      "lowerCase"
    ]
  },
  "firstLetter": {
    "identifier": "replace",
    "pattern": "^(.)(.*)",
    "replacement": "$1"
  },
  "afterFirstLetter": {
    "identifier": "replace",
    "pattern": "^(.)(.*)",
    "replacement": "$2"
  },
  "lowerCase": {
    "identifier": "lowerCase"
  }
}

关于templates - 如何使用 .NET CLI 自定义模板获取项目名称的驼峰式版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55738119/

相关文章:

c++ - 推导参数失败,适用于返回值

c++ - 检查数组是否为标量类型

c++ - 类模板特化偏序和函数综合

c# - 如何修复 "You must install or update .NET to run this application."错误?

c++ - boost::lexical_cast 和非内置类型的字符串化

c++ - 为什么没有在这个 C++ 类的 .o 文件中定义一个函数?

c# - 无法发布 .NET Core 应用程序(运行时不受支持)

visual-studio-2017 - dotnet build 不显示 Visual Studio 所显示的 StyleCop 警告

c# - 在非 c# 文件中的 dotnet 新模板中添加可选内容

azure-devops - DotNetCLI@2 包似乎忽略了配置输入