visual-studio - 替换为从文件读取或从代码生成的值?
问题描述
在 SlowCheetah 中,我想转换我的配置文件中的一些元素,而不是使用转换文件中的硬编码值,而是使用另一个文件的内容或(最好)从代码生成的值。例如,在从代码生成值的情况下,而不是这样:
{
"someSettings": {
"@jdt.replace": {
"timeTokenAtBuild": "1f3ac2"
}
}
}
...我想要这样的东西:
{
"someSettings": {
"@jdt.replace": {
"timeTokenAtBuild": [MyUtilitiesLibrary.GetCurrentTimeToken()]
}
}
}
从 PowerShell 脚本之类的东西中获取价值也可以。我现在可以用 SlowCheetah 做到这一点吗?如果不是,扩展它以允许此功能有多难?
或者,我可以使用其他一些 NuGet 包或 msbuild 机制来实现此行为吗?
解决方案
替换为从文件读取或从代码生成的值?
不知道SlowCheetah。但是对于 MSBuild,您可以定义一个自定义替换任务来执行此操作:
<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<InputFilename ParameterType="System.String" Required="true" />
<OutputFilename ParameterType="System.String" Required="true" />
<MatchExpression ParameterType="System.String" Required="true" />
<ReplacementText ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Reference Include="System.Core" />
<Using Namespace="System" />
<Using Namespace="System.IO" />
<Using Namespace="System.Text.RegularExpressions" />
<Code Type="Fragment" Language="cs">
<![CDATA[
File.WriteAllText(
OutputFilename,
Regex.Replace(File.ReadAllText(InputFilename), MatchExpression, ReplacementText)
);
]]>
</Code>
</Task>
</UsingTask>
然后你可以使用这个任务来替换配置文件的元素:
<Target Name="BeforeBuild">
<ReplaceFileText
InputFilename="$(YouConfigFilePath)YourConfigFile.config"
OutputFilename="$(YouConfigFilePath)YourConfigFile.config"
MatchExpression="1f3ac2"
ReplacementText="$(Value)" />
</Target>
请注意,由于替换值是从代码生成的,因此您可能需要使用 PowerShell 脚本或其他脚本来设置 msbuild 属性的值:
如何使用 powershell 设置 msbuild 属性的值?
希望这可以帮助。
推荐阅读
- php - 如果是 Laravel 控制器
- vba - ZPL Printer 虚拟 Zebra 打印机 Chrome 插件不能打印多个图像
- python - 使用 urllib3 UnicodeDecodeError 上传文件
- rust - 通过引用获取 Rust 所有权?
- php - 没有前导 0 PHP 的分钟或秒
- mysql - 使用 mysql 和 node.js 进行多参数搜索
- c# - 执行获取 List
ids 作为参数 - css - laravel 6 - 基于多租户的 CSS
- java - 其他活动使用的捆绑包中未显示字符串
- java - 如何从 Document Uri 获取孩子的 DocumentFile