我在Visual Studio 2017 Enterprise(版本15.4)中设置了一个python项目,作为混合项目解决方案的一部分,该解决方案还包含各种C#(。Net 4.6.2,.Net Core 2.0和Xamarin)项目。在构建期间,我想使用一些自编的C#工具生成几个.py源代码文件,这也是构建的一部分。此外,.pyproj文件中列为“编译”项的所有.py文件都应压缩为.zip文件并写入某个输出目录。
在我的.pyprof MSBuild文件中,我创建了两个“自定义构建步骤”目标,如下所示:
<Target Name="MyPreBuildStep" BeforeTargets="Build">
Call self-written py-Code generator
</Target>
<Target Name="MyPostBuildStep" AfterTargets="Build"
Inputs="@(Compile)"
Outputs="$(OutputPath)\$(PythonProjectName).zip">
<Zip ZipFileName="$(OutputPath)\$(PythonProjectName).zip"
WorkingDirectory="$(MSBuildProjectDirectory)\..\" Files="@(Compile)" />
</Target>
从MSBuildCommunityTasks导入Zip任务。
如果我在Visual Studio中右键单击该项目并点击“Rebuild”,一切正常。 py代码是预先生成的,所有@(编译)项都放入.zip文件中。
不幸的是,正常的“构建”永远不会调用上述目标。因此,通过我当前的设置,我可以通过点击“构建”来构建包含解决方案的40个项目但是,通过点击“重建”,python项目需要额外的邀请。非常烦人。
我试图调查“Microsoft.Python.Tools.Web.targets”和“Microsoft.Python.Tools.targets”的内容。在这些文件中的某处,评论说: “构建目标作为发布阶段的一部分被调用。” 嗯。
有人可以告诉我如何在.pyproj中指定一些简单的自定义构建步骤,这些步骤只能在正常的“构建”期间工作吗?
谢谢。
答案 0 :(得分:0)
Build
仅在需要时调用,这是根据比较输入和输出文件的最后修改时间确定的。
大多数情况下会自动收集,但在您的情况下,输出文件无法识别,因此不会影响是否需要构建。 (如果您检查Microsoft.PythonTools.targets
并找到BuiltProjectOutputGroup
和SourceFilesProjectOutputGroup
目标,则这些是提供文件的目标。)
在这种情况下,您只需要将ZIP文件添加为输出文件,以便进行检查。你可以这样做:
<ItemGroup>
<OutputFiles Include="$(OutputPath)\$(PythonProjectName).zip">
<Visible>false</Visible>
</OutputFiles>
</ItemGroup>
请注意,它必须在不运行构建目标的情况下可用,因此您必须能够静态地计算路径,但现在如果此文件不存在或任何源文件比它更新,项目应该重建