我正在尝试通过MSBuild实现以下目标:我的主项目(MyProject.csproj
)应该包含几个Reference
项,但是到这些Reference
之一的路径是SomeProperty
属性的值,由目标设置。具体来说,使用SomeProperty
从文件中解析ReadLinesFromFileTask
的值。
这是ReadLinesFromFileTask
的高级结构:
MyProject.csproj
很遗憾,此设置无法正常工作。我在VS Solution Explorer的<Project>
<Target Name="CreateSomeProperty">
<!-- Tasks that ultimately set $(SomeProperty) by parsing a value with ReadLinesFromFileTask -->
</Target>
<ItemGroup>
<Reference Include="$(SomeProperty)" />
<!-- Other Reference items -->
</ItemGroup>
</Project>
的Dependencies
节点下看到了那些小的黄色三角形,因为该项目正在寻找缺少字符的路径中的DLL。同样,在构建项目时,即使我仍然在Target内看到MyProject
任务的输出,也会遇到一堆The type or namespace name could not be found
错误。估计Message
目标在执行阶段正在运行,在CreatePathProperty
项目在评估阶段已无法加载之后。
是否有办法进行这样的设置?我尝试在Reference
元素中设置BeforeTargets="Build"
,并在Target
元素中设置InitialTargets="CreateSomeProperty"
,但似乎没有任何效果。任何帮助将不胜感激!
MSBuild项可以使用目标设置的属性吗?
是的,我确定这是可能的,而您想要的是VS2017中受支持的方案。
Tips:
通常Project
在执行自定义目标之前先读取msbuild
和Properties
。因此,我们应该使用类似Items
的方法来确保在这种情况下正确的顺序是BeforeTargets="BeforeResolveReferences"
。否则顺序(custom target runs=>create the property=>msbuild reads the info about references and the property
或其他顺序错误的顺序应为:BeforeTargets="Build"
。
解决方案:
Msbuild reads the info about references(now the property is not defined yet)=>the target runs and creates the property