Esharp LeMP #r "path" 仅适用于 compileTime 指令中的绝对路径



我使用的是最新版本2.8.1

我尝试了项目源和二进制相对路径,但没有成功。这是代码:https://github.com/dadhi/LempTest/blob/strongtext9ce17d16a8d7c71fc475921e1414e5bc64d72f9d/LibWithEcs/ServiceRegistrations.ecs.包括#L3

此外,我不知道如何通过--set:key=value传递目录。我应该将键或值括在引号中,还是应该转义斜杠?如果我成功地通过了,我能在compileTime节中#get(key(并以某种方式将其用于#r吗?

更新-使用@Qwertie答案后

我创建了一个简单的Test.ecs文件来测试--set:key=value输出

compileTime 
{
using C = System.Console;
var a = #get(a);
C.WriteLine(a);
}

这里我发现:

  • CCD_ 3返回";错误:应为粒子(id、文字、{大括号}或(parens((">
  • CCD_ 4返回";c: ">
  • CCD_ 5返回相同的";c: ">
  • CCD_ 6再次返回相同的";c: ">

和至少

  • CCD_ 7工作并输出";c: \代码">

更新-将Path值从MSBuild Exec目标传递到Lemp

对我来说,最后一个难题是将$(ProjectDir)作为set:key=value命令行开关的值进行传递。以下是最终解决方案(实际上不是,请参阅下面的更新(:

<Target Name="LempTransform" BeforeTargets="BeforeBuild">
<PropertyGroup>
<ProjectDirEscaped>$(ProjectDir.Replace('', '___'))</ProjectDirEscaped>
</PropertyGroup>
<!-- <Message Text="Project with escaped slashes is $(ProjectDirEscaped)" Importance="high"/> -->
<Exec WorkingDirectory="$(ProjectDir)" 
Command="dotnet lemp %(EcsFile.Identity) --outext=.Generated.cs --set:ProjectDir=@&quot;$(ProjectDirEscaped)&quot;" />
</Target>

主要问题是,即使使用@&quot$(ProjectDir)&quot;也是不够的,因为ProjectDir输出的路径带有像c:foobar这样的单斜杠。那么就没有办法在字符串文本中对它们进行转义。因此,我最终用string.Replace手动替换斜杠,然后在使用.ecs文件中的密钥时将其替换回来:

compileTime 
{
##reference(precompute(System.IO.Path.Combine(#get(ProjectDir).Replace("___", "\"), @"..AnotherLibbinDebugnetstandard2.0AnotherLib.dll")));
using AnotherLib;
//...

更新-一个更简单的解决方案,通过@Qwertie注释将向后替换为正斜杠

这个注释帮助很大,所以我不需要在消费模板中Replace转义值。

首先,我将替换为/,而不是___,这仍然保持路径a对.NET BCL API:有效

<PropertyGroup>
<ProjectDirEscaped>$(ProjectDir.Replace('', '/'))</ProjectDirEscaped>
</PropertyGroup>

因此,当使用##reference:中的路径时,我不需要Replace

##reference(precompute(System.IO.Path.Combine(#get(ProjectDir), @"..AnotherLibbinDebugnetstandard2.0AnotherLib.dll")));

#r中的相对路径在Visual Studio扩展中对我有效。路径应该是相对于源文件位置的。

为了找出文件"所在的输入文件夹;相信";也就是说,在文件顶部写入#get(#inputFolder);,然后查看LeMP的输出。如果输出显示_numget(_numinputFolder),则表示出现了问题-变量未设置,但可以在命令行上设置其值:--set:#inputFolder="C:\Dev\MyFolder"

--set:之后,key=value被解析为赋值表达式,因此您应该将值用引号括起来,并用双反斜杠替换反斜杠。(表达式语法为LES或当前输入语言(如果有(---inlang=ecs用于增强型C#(

您可以在compileTime中使用#get(key);然而,lemp Test.ecs --set:a="c:"0指令是以一种非常愚蠢的方式解析的,因为该指令的语法非常愚蠢(与普通的C#字符串不同(。因此,无法在#r行上使用宏。你可能不需要绕过这个限制,但如果你这样做了,你可以用等效的Loyc树##reference(@"""dir\Foo.dll""");替换#r "dirFoo.dll"(额外的引号是可选的(,然后你可以在修改后的行中使用宏。

我没有想到可以在compileTime中使用precompute,但你可以并且它有效。例如,你可以做##reference(precompute(System.IO.Path.Combine(@"dir", "Foo.dll")));

最新更新