我正在使用最新版本 2.8.1
我尝试了项目源和二进制相对路径但没有成功。这是代码:https://github.com/dadhi/LempTest/blob/strong text9ce17d16a8d7c71fc475921e1414e5bc64d72f9d/LibWithEcs/ServiceRegistrations.ecs.include#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);
}
这是我发现的:
lemp Test.ecs --set:a="c:"
返回“错误:需要一个粒子(id、literal、{braces} 或(parens))。”lemp Test.ecs --set:a=@"c:"
返回“c:”lemp Test.ecs --set:a=@"c:\Code"
返回相同的“c:”lemp Test.ecs --set:a=@"c:\\Code"
再次返回相同的“c:”
并且至少
lemp Test.ecs --set:a="""c:\\Code"""
工作并输出“c:\Code”
更新 - 将路径值从 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:\foo\bar
. 那么就没有办法在字符串文字中转义它们了。所以我最终手动替换了斜杠string.Replace
,然后在使用.ecs
文件中的密钥时将它们替换回来:
compileTime
{
##reference(precompute(System.IO.Path.Combine(#get(ProjectDir).Replace("___", "\\"), @"..\AnotherLib\bin\Debug\netstandard2.0\AnotherLib.dll")));
using AnotherLib;
//...
更新 - 一个更简单的解决方案,通过每个 @Qwertie 评论用正斜杠替换向后
评论有很大帮助,所以我不需要Replace
在使用模板时转义值。
首先,我替换\
为,/
而不是___
仍然保持路径对 .NET BCL API 有效:
<PropertyGroup>
<ProjectDirEscaped>$(ProjectDir.Replace('\', '/'))</ProjectDirEscaped>
</PropertyGroup>
Replace
因此,在使用路径时我不需要##reference
:
##reference(precompute(System.IO.Path.Combine(#get(ProjectDir), @"..\AnotherLib\bin\Debug\netstandard2.0\AnotherLib.dll")));