c++ 如何在Visual Studio 2008中创建自定义清理(清理后)事件?

ufj5ltwl  于 12个月前  发布在  其他
关注(0)|答案(7)|浏览(126)

在我们的构建过程中,对于每个项目,我们使用PostBuild事件将可执行文件复制到单独的部署目录中。但问题是,我们遇到的问题与陈旧的文件后,执行一个清洁解决方案/清洁项目。我想建立一个“清洁”事件删除复制的文件,而Visual Studio 2008似乎没有在项目属性页中提供选项。
它有:

Build Events:
   Pre-Build Event
   Pre-Link Event
   Post-Build Event
Custom Build Step
   General

字符串
我想找到的是在清理项目时执行任意命令行的方法。

lztngnrs

lztngnrs1#

您可以在csproj文件中使用MSBuild目标语法。

<Target Name="AfterClean">
    <Delete Files="$(OutDir)\$(TargetName).exe" ContinueOnError="true" />
  </Target>

字符串
在MSBuild团队博客中描述了一种直接在Visual Studio IDE中编辑.csproj文件的简洁方法,但这是我的第一篇文章,所以我只能包含一个超链接。(简单地说:卸载项目,然后右键单击它以查看条目“Edit [project].csproj”.您的csproj将在IDE中以xml文件的形式出现,并对元素和属性进行智能感知。太棒了!)
自定义目标的完整列表是here

tzcvj98z

tzcvj98z2#

对于Visual C++项目,您需要将文件添加到“General”项目配置属性下的“Extensions to Delete On Clean”部分。尽管它声称需要扩展,但实际上它使用的是globs,并且很乐意接受完整路径并扩展MSBuild变量。这对我很有效:
第一个月
我不确定你是否可以用这种方式删除目录,但它至少可以获取文件。

bxjv4tth

bxjv4tth3#

如果你使用“项目属性-->配置属性-->自定义构建设置”,你必须记住填写“输出”字段,否则它不会运行。
发件人:
http://blogs.msdn.com/b/visualstudio/archive/2010/04/26/custom-build-steps-tools-and-events.aspx
“Outputs属性是一个以分号分隔的文件列表,并且必须列出在执行自定义生成步骤时生成的任何文件。如果将Outputs属性留空,则自定义生成步骤将永远不会执行,因为MSBuild将确定没有任何输出过期。如果步骤不生成文件,但仍希望它在每次生成时执行,编造一个假的文件名就可以了,因为那个文件永远不会存在,MSBuild总是会确定自定义构建步骤已经过时。

czfnxgou

czfnxgou4#

您需要手动编辑.csproj文件并添加“AfterClean”目标。

cnwbcb6i

cnwbcb6i5#

不幸的是,没有一种文档化的方法可以插入自定义的清理步骤。您可以在预生成事件中清理输出,但在清理之后仍然会留下工件。
在MSDN中,以下是各个生成步骤的调用顺序:
1.建置前事件
1.对单个文件自定义生成步骤
1.代理生成器

  1. Midl
    1.资源编译器
  2. C/C++编译器
    1.预链接事件
    1.链接器或库管理器(如适用)
  3. BSCMake
    1.项目上的自定义生成步骤
    1.部署工具。
    1.生成后事件
    MSDN:Understanding custom build steps
f5emj3cl

f5emj3cl6#

其他人没有完全按照我的要求做,我只是找到了一个更好的方法。在VS2010中测试了C++ Win32项目,转到项目属性-->配置属性-->自定义构建设置。你可以添加一个自定义命令行,并告诉VS在命令之前或之后执行什么操作。

bn31dyow

bn31dyow7#

也许这在当时(VS 2008/ .NET 3.5)是不可用的,但它现在对我来说工作得很好(VS 2022专业版).这个例子是在清理之前停止并删除一个名为Service1的Windows服务(这将删除可执行文件,并导致之后操作服务数据库的困难),但任何cmd命令都可以在这里使用。

<Target Name="BeforeClean">
    <Message Text="This target will only be built when cleaning the project." />
    <Exec Command="cmd.exe /c sc stop Service1" ContinueOnError="WarnAndContinue" />
    <Exec Command="cmd.exe /c sc delete Service1" ContinueOnError="WarnAndContinue" />
</Target>

字符串

相关问题