gpt4 book ai didi

c# - MSBuild 项可以使用目标设置的属性吗?

转载 作者:行者123 更新时间:2023-12-04 11:30:59 29 4
gpt4 key购买 nike

我正在尝试使用 MSBuild 实现以下目标:我的主要项目( MyProject.csproj )应该包括一对 Reference项目,但其中之一的路径 Reference s 是 SomeProperty 的值属性,由 Target 设置。具体来说,SomeProperty 的值使用 ReadLinesFromFileTask 从文件中解析.

这是MyProject.csproj的高层结构:

<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 下看到了那些黄色的小三角形 MyProject的节点在 VS 解决方案资源管理器中,因为该项目正在寻找缺少字符的路径中的 DLL。同样,当我构建项目时,我得到一堆 The type or namespace name could not be found错误,即使我仍然看到 Message 的输出我的目标内的任务。据推测, CreatePathProperty目标在执行阶段运行,在 Reference 之后项目在评估阶段已无法加载。

有没有办法让这样的设置工作?我试过设置 BeforeTargets="Build"Target元素和设置 InitialTargets="CreateSomeProperty"Project元素,但似乎没有任何效果。任何帮助将非常感激!

最佳答案

Can an MSBuild Item use a Property set by a Target?



是的,如果您在 .net framework project with old csproj format,我相信这是可能的而你想要的是VS2017中支持的场景(只在VS2017中做了测试)。

温馨提示:

通常 msbuild阅读 PropertiesItems在它执行您的自定义目标之前。所以我们应该使用类似 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 .

解决方案:
将此脚本添加到 xx.csproj 的底部。
  <!-- Make sure it executes before msbuild reads the ItemGroup above and loads the references -->
<Target Name="MyTest" BeforeTargets="BeforeResolveReferences">
<ItemGroup>
<!-- Define a TestFile to represent the file I read -->
<TestFile Include="D:\test.txt" />
</ItemGroup>
<!-- Pass the file to read to the ReadLinesFromFile task -->
<ReadLinesFromFile File="@(TestFile)">
<!--Create the Property that represents the normal hintpath(SomePath\DLLName.dll)-->
<Output TaskParameter="Lines" PropertyName="HintPathFromFile" />
</ReadLinesFromFile>
<!-- Output the HintPath in output log to check if the path is right -->
<Message Text="$(HintPathFromFile)" Importance="high" />
<ItemGroup>
<Reference Include="TestReference">
<!--It actually equals:<HintPath>D:\AssemblyFolder\TestReference.dll</HintPath>-->
<HintPath>$(HintPathFromFile)</HintPath>
</Reference>
</ItemGroup>
</Target>

另外:

我用 test.txt 做了测试其内容为:

enter image description here

我不确定您文件的实际内容(和格式),但如果您只有像 D:\AssemblyFolder\ 这样的路径在该文件中,您应该传递 D:\AssemblyFolder\+YourAssemblyName.dll<HintPath>元数据。引起 默认 reference格式为 hintpath看起来像这样:
  <Reference Include="ClassLibrary1">
<HintPath>path\ClassLibrary1.dll</HintPath>
</Reference>

注意路径格式!希望我的回答有帮助:)

关于c# - MSBuild 项可以使用目标设置的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58965544/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com