Powershell MSBuild:如何导入项目路径?

Powershell MSBuild:如何导入项目路径?,powershell,msbuild,msbuild-task,msbuildcommunitytasks,msbuild-propertygroup,Powershell,Msbuild,Msbuild Task,Msbuildcommunitytasks,Msbuild Propertygroup,几年前也有人问过类似的问题,但我想知道在此期间是否有什么变化,或者人们是否有新的想法如何做到这一点 我已将MSBuildTasks(MSBuild社区任务)作为Nuget包导入到解决方案中的项目中。我可以为.targets文件的路径定义一个属性,如下所示: <PropertyGroup> <MSBuildTasks>$(SolutionDir)Packages\MSBuildTasks.1.5.0.235\tools\MSBuild.Community.Tasks

几年前也有人问过类似的问题,但我想知道在此期间是否有什么变化,或者人们是否有新的想法如何做到这一点

我已将MSBuildTasks(MSBuild社区任务)作为Nuget包导入到解决方案中的项目中。我可以为.targets文件的路径定义一个属性,如下所示:

<PropertyGroup>
    <MSBuildTasks>$(SolutionDir)Packages\MSBuildTasks.1.5.0.235\tools\MSBuild.Community.Tasks.Targets</MSBuildTasks>
</PropertyGroup>
。。。并将其作为MSBuild的命令行属性注入:

msbuild $solutionFile "/p:Configuration=$buildConfiguration;Platform=$buildPlatform;MSBuildTasks=$MSBuildTasks";
我可以通过一条消息确认注入的路径确实已传输到我的目标:

<Target Name="_ReportMSBuildTasksPath" BeforeTargets="_ComputeSemanticVersion">
    <Message Text="MSBUILDTASKS = $(MSBuildTasks)"/>
</Target>

。。。但如果我尝试使用上述相同的import语句进行导入,则会收到以下错误消息:

The value "" of the "Project" attribute in element <Import> is invalid.  Parameter "path" cannot have zero length.
元素中“Project”属性的值“”无效。参数“路径”的长度不能为零。

这就是我失去创意的地方。如何避免在工具路径中硬编码版本号?

我发现您需要手动导入某些内容很奇怪。 MSBuildTasks NuGet包包括
build\MSBuildTasks.targets
。VisualStudio应该自动将此文件的导入添加到.csproj文件中

这个导入路径由VisualStudio中的NuGet包管理器维护

因此,您应该能够使用所需的任务,而无需手动导入任何内容


如果它不起作用,请检查.csproj文件是否真的包含自动生成的导入到上述适当的
.targets
文件。

我发现您需要手动导入某些内容很奇怪。 MSBuildTasks NuGet包包括
build\MSBuildTasks.targets
。VisualStudio应该自动将此文件的导入添加到.csproj文件中

这个导入路径由VisualStudio中的NuGet包管理器维护

因此,您应该能够使用所需的任务,而无需手动导入任何内容


如果它不起作用,那么请检查.csproj文件是否真的包含自动生成的导入到上述适当的
.targets
文件。

我可以理解其中的原因,但你必须问问自己:版本更改是否真的如此频繁/常见,是否值得拥有额外的复杂性?如果将
MSBuildTasks
属性放入一个公共文件,例如
Paths.props
,该文件位于源代码树中的已知位置,然后将该文件导入到需要该路径的任何其他项目文件中。至少你只需要更新一个地方,这在某种程度上取决于我们考虑的额外复杂性。我在使用MSBuildTasks的同时还使用了一些其他工具(尽管谢天谢地,它们不需要导入!),这些工具的最新版本都由该脚本自动检测并作为命令行参数提供。手动维护MSBuildTasks本身并不是什么大不了的事,但我想将其纳入考虑范围,再次假设这项工作不是很重要。拥有额外的工具来解决这类问题可能比我在这里要解决的具体问题对未来更有价值。这是很公平的。就个人而言,在我的项目文件中,我必须从NuGet软件包维护大约3到4个这样的路径(OpenCover等)。我使用上述方法。当然是YMMV;-)我可以理解其中的原因,但你必须问问自己:版本更改是否真的如此频繁/普遍,以至于需要额外的复杂性?如果将
MSBuildTasks
属性放入一个公共文件,例如
Paths.props
,该文件位于源代码树中的已知位置,然后将该文件导入到需要该路径的任何其他项目文件中。至少你只需要更新一个地方,这在某种程度上取决于我们考虑的额外复杂性。我在使用MSBuildTasks的同时还使用了一些其他工具(尽管谢天谢地,它们不需要导入!),这些工具的最新版本都由该脚本自动检测并作为命令行参数提供。手动维护MSBuildTasks本身并不是什么大不了的事,但我想将其纳入考虑范围,再次假设这项工作不是很重要。拥有额外的工具来解决这类问题可能比我在这里要解决的具体问题对未来更有价值。这是很公平的。就个人而言,在我的项目文件中,我必须从NuGet软件包维护大约3到4个这样的路径(OpenCover等)。我使用上述方法。当然是YMMV;-)实际上,我正在构建一个自定义的.targets文件,希望通过nuget软件包安装该文件;该目标将被其他项目使用,并且它需要能够导入MSBuildTasks目标。nuspec文件将指定MSBuildTasks作为依赖项,我相信这意味着我将在安装时获得指定的版本或更新的版本。因此将指定导入路径,但我不确定能否保证它始终是我安装的特定版本;该目标将被其他项目使用,并且它需要能够导入MSBuildTasks目标。nuspec文件将指定MSBuildTasks作为依赖项,我相信这意味着我将在安装时获得指定的版本或更新的版本。因此将指定导入路径,但我不确定能否保证它始终是我安装的特定版本。
<Target Name="_ReportMSBuildTasksPath" BeforeTargets="_ComputeSemanticVersion">
    <Message Text="MSBUILDTASKS = $(MSBuildTasks)"/>
</Target>
The value "" of the "Project" attribute in element <Import> is invalid.  Parameter "path" cannot have zero length.