MSBuild 不解析路径内的参数

Posted

技术标签:

【中文标题】MSBuild 不解析路径内的参数【英文标题】:MSBuild Not Resolving Parameters inside Path 【发布时间】:2020-04-07 11:59:35 【问题描述】:

我必须使用 ms build 运行文本转换文件,所以我使用 Transform 作为目标。为了在我的项目中运行它,我必须传递一些路径来获取资源 dll。所以我的命令是

D:\WorkSpace\Projects\Client\Dev\Project\Lw.Domain.Project>msbuild  /tv:15.0 /t:transform /p:TransformFile="ProjectEntityModelGenerator.tt" /p:SolutionDir=".." /p:FrameworkVersion=4 /p:MetaModelFolder="$(SolutionDir)\packages\LW.Framework$(FrameworkVersion)" /p:BaseResourceFolder="$(SolutionDir)\packages\LW.Framework$(FrameworkVersion)" /p:FrameworkReference="package" /p:IsFromMSBuild="true"

但它没有解决路径,所以我遇到了如下问题,

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\TextTemplating\Microsoft.TextTemplating.targets(340,5): 错误:System.IO.FileNotFoundException:找不到一部分 小路 'D:\WorkSpace\Projects\Client\Dev\Project\Lw.Domain.Project\$(SolutionDir)\packages\LW.Framework$(FrameworkVersion)Lw.System.Metamodel.dll'。

 [D:\WorkSpace\Projects\Client\Dev\Project\Lw.Domain.Project\Lw.Domain.Project.csproj]

我的 csproj 文件中是否缺少某些内容?下面是我的csproj文件配置,

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <PropertyGroup>
    <!-- Get the Visual Studio version – defaults to 10: -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <!-- Keep the next element all on one line: -->
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <SolutionDir>$(SolutionDir)</SolutionDir>
    <FrameworkVersion>$(FrameworkVersion)</FrameworkVersion>
    <MetaModelFolder>$(SolutionDir)\packages\LW.Framework$(FrameworkVersion)\</MetaModelFolder>
    <BaseResourceFolder>$(SolutionDir)\packages\LW.Framework$(FrameworkVersion)\</BaseResourceFolder>
    <IsFromMSBuild>$(IsFromMSBuild)</IsFromMSBuild>
    <ComputedSolutionDir>$([System.IO.Path]::GetFullPath($([System.IO.Path]::Combine($(ProjectDir),"..\\"))))</ComputedSolutionDir>
    <DomainResourceFolder>$(SolutionDir)..\Product\Lw.Domain\bin\$(Configuration)\</DomainResourceFolder>
  </PropertyGroup>
  <Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" Condition="'$(VisualStudioVersion)' == '15.0'" />

【问题讨论】:

我的 csproj 文件中是否缺少某些内容? 我不知道;你没有发布你的 CSProj 文件。 【参考方案1】:

我在本地项目上进行了测试,发现不能在命令行中使用 csproj 文件中相同的语法"$()" 传递属性。

您需要将 BaseResourceFolder 的确切物理路径传递给命令行。从下面的错误。您也错过了 BaseResourceFolder 值末尾的“\”。

'D:\WorkSpace\Projects\Client\Dev\Project\Lw.Domain.Project\$(SolutionDir)\packages\LW.Framework$(FrameworkVersion)Lw.System.Metamodel.dll'。

/p:BaseResourceFolder="(phsical path to BaseResourceFolder)\"

希望以上内容对您有所帮助。

【讨论】:

嗨@azhahes.s 您是否查看了上面的答案,进展如何?如果有任何问题,请告诉我。 谢谢@levi。请查看我的新question

以上是关于MSBuild 不解析路径内的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何从解决方案的角度正确配置 SonarQube MSBuild Scanner?

如何在 MSBuild 的 Exec 命令中转义引号

模仿 msbuild 进程的程序集解析

MSBuild 发布转换路径

如何从正在处理的项目文件中访问 msbuild 命令行参数?

给定相对路径时,如何让 MSBUILD 评估和打印完整路径?