我使用的是最新版本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=@"$(ProjectDirEscaped)"" />
</Target>
主要问题是,即使使用@"$(ProjectDir)"
也是不够的,因为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")));
。