bra*_*ing 5 .net msbuild continuous-integration visual-studio-2017 .net-standard-2.0
我有foo.csproj,
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Label="Globals">
<ExtPath>$(SolutionDir)\WpfNetStandardSample\CustomProjectSystem\</ExtPath>
</PropertyGroup>
<Import Project="$(ExtPath)CustomProject.props" />
</Project>
Run Code Online (Sandbox Code Playgroud)
从解决方案文件bar.sln引用。
要从持续集成服务器恢复我的 NuGet 包,我运行
msbuild /t:restore bar.sln
Run Code Online (Sandbox Code Playgroud)
我收到错误:
“C:\Users\phelan\workspace\bar\bar.sln”(恢复目标)(1) -> “C:\Users\phelan\workspace\bar\foo\foo.csproj”(_IsProjectRestoreSupported 目标)(11) -> C:\Users\phelan\workspace\bar\foo\foo.csproj(7,3):错误 MSB4019:找不到导入的项目“C:\WpfNetStandardSample\CustomProjectSystem\CustomProject.props”。确认声明中的路径正确,并且该文件存在于磁盘上。
SolutionDir如何以及为何解析为C:\而不是解决方案文件所在的目录?
msbuild foo.sln构建整个解决方案(假设 NuGet 包已恢复)我的混合设置类型的正确流程是什么?
发生这种情况是因为对于解决方案的Restore目标,SolutionDir未传递给生成的项目引用。
运行时你可以看到这个:
MSBuildEmitSolution=1 dotnet msbuild /t:Restore
Run Code Online (Sandbox Code Playgroud)
对于 a,foo.sln这将生成一个foo.sln.metaproj文件,其中包含解决方案格式的实际 MSBuild 解释,以及添加的扩展(例如15.0/SolutionFile/ImportAfter/Microsoft.NuGet.ImportAfter.targets在我们的例子中)。
生成的Build目标包含以下内容:
<Target Name="Build" Outputs="@(CollectedBuildOutput)">
<MSBuild Projects="@(ProjectReference)" BuildInParallel="True" Properties="BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" SkipNonexistentProjects="%(ProjectReference.SkipNonexistentProjects)">
<Output TaskParameter="TargetOutputs" ItemName="CollectedBuildOutput" />
</MSBuild>
</Target>
Run Code Online (Sandbox Code Playgroud)
您可以看到这显式设置了SolutionDir其他与解决方案相关的属性。这同样适用于解决方案中生成的许多其他目标。
然而,NuGet 目标不会执行此操作(技术原因是它们为项目和解决方案共享相同的 MSBuild 代码)。检查<MSBuild>NuGet 创建的项目时,它们不会设置这些属性,因此在评估期间它们在项目中不可用。
作为解决方法,我建议使用 MSBuild 15 的Directory.Build.props逻辑,它将具有此名称的文件自动导入到使用公共属性/目标的所有项目(几乎所有项目类型)中。
在此文件中,放置在解决方案目录或其适用的项目上方的任何目录中,您可以设置要在项目中使用的变量 ( ExtPath) 或直接设置所需的公共属性:
<Project>
<PropertyGroup>
<ExtPath>$(MSBuildThisFileDirectory)</ExtPath>
<VersionPrefix>1.2.3</VersionPrefix>
</PropertyGroup>
<Import Project="$(ExtPath)Some\other.props" />
</Project>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2579 次 |
| 最近记录: |