如何在Visual Studio pyproj项目中设置自定义构建步骤

时间:2017-11-01 18:58:25

标签: python visual-studio-2017 ptvs

我在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中指定一些简单的自定义构建步骤,这些步骤只能在正常的“构建”期间工作吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

Build仅在需要时调用,这是根据比较输入和输出文件的最后修改时间确定的。

大多数情况下会自动收集,但在您的情况下,输出文件无法识别,因此不会影响是否需要构建。 (如果您检查Microsoft.PythonTools.targets并找到BuiltProjectOutputGroupSourceFilesProjectOutputGroup目标,则这些是提供文件的目标。)

在这种情况下,您只需要将ZIP文件添加为输出文件,以便进行检查。你可以这样做:

<ItemGroup>
    <OutputFiles Include="$(OutputPath)\$(PythonProjectName).zip">
        <Visible>false</Visible>
    </OutputFiles>
</ItemGroup>

请注意,它必须在不运行构建目标的情况下可用,因此您必须能够静态地计算路径,但现在如果此文件不存在或任何源文件比它更新,项目应该重建