我的公司已对自定义MSBuild目标文件库进行了大量投资,我们使用这些文件来构建完整产品。我们在源代码管理中拥有的每个项目文件都至少会导入一个自定义目标文件,最终最终所有这些文件都会导入一个核心目标文件,其中包含我们的大量通用目标和属性。
最近我们在解决方案中添加了一个新的SSRS项目,并且该项目(我认为)是2017年底引入的新rptproj格式-特别是,它声明了ToolsVersion="15.0"
并从其中导入了Microsoft.ReportingServices.MSBuilder.targets
VS 2017安装目录中。
我遇到的问题是,我对rptproj文件所做的逻辑更改似乎都没有做任何事情。导入共享目标文件不会导致执行任何目标,例如声明BeforeTargets="BeforeBuild"
的目标,甚至不会针对BeforeTargets="ReportBuilderTarget"
的ReportingServices特定目标进行设置。
此外,尝试设置OutputPath会导致异常奇怪的行为。声明如下的OutputPath:
<OutputPath>$(SharedOutputPath)SSRS\$(MSBuildProjectName)</OutputPath>
...将在项目文件目录中的以下文件夹中生成后生成:
C:\workspace\solutionfolder\ReportProject1\$(SharedOutputPath)SSRS\$(MSBuildProjectFile)
这很奇怪,因为它甚至没有将众所周知的元数据令牌$(MSBuildProjectName)
解释为一个属性,并没有将它和$(SharedOutputPath)
都作为字符串文字发送到OutputPath属性。
此外,将rptproj文件保存在VS中会导致将所有自定义项全部擦除。
回顾Microsoft.ReportingServices.MSBuilder.targets
文件,似乎它对基础Microsoft.Common.targets
文件进行了广泛的删节,但是我无法想象这会阻止MSBuild属性或其他任何基本用法。
尽管这与我对MSBuild的了解程度有关,所以我不确定从哪里获取知识。
总体看来,MSBuild对rptproj文件的支持有些不成熟,但是我缺少什么吗?
答案 0 :(得分:1)
是否可以自定义Visual Studio 2017 SSRS rptproj MSBuild文件?
作为解决方法,yon可以使用MSBuild命令行构建项目。
作为测试,我将SSRS rptproj的默认OutputPath
覆盖为:
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<FullPath>Debug</FullPath>
<OutputPath>bin\Debug\$(MSBuildProjectName)</OutputPath>
...
</PropertyGroup>
并在.rptproj
文件中添加自定义目标:
<Target Name="Test" BeforeTargets="BeforeBuild">
<Message Text="$(OutputPath)"></Message>
</Target>
然后我使用MSBuild命令行构建项目:
msbuild "<ProjectPath>.rptproj" /property:Configuration=Debug
结果:
然后在build.obj
文件夹中生成了构建文件bin\Debug\Report Project1
。
希望这会有所帮助。