Visual Studio后构建事件 - 复制到相对目录位置

266
在成功构建后,我希望将输出目录的内容复制到相同"base"文件夹下的不同位置。这个父文件夹是一个相对的部分,根据源代码管理设置可能会有所不同。
我列出了一些可用的宏值... $(SolutionDir) = D:\GlobalDir\Version\AppName\Solution1\build $(ProjectDir) = D:\GlobalDir\Version\AppName\Solution1\Version\ProjectA\
我想要将输出目录的内容复制到以下文件夹: D:\GlobalDir\Version\AppName\Solution2\Project\Dependency
基本位置“D:\GlobalDir\Version\AppName”需要从上述任何宏中获取。然而,没有任何宏值仅列出父位置。
如何提取后构建复制命令的基础位置?
7个回答

346

以下是您需要在项目的“后期生成事件命令行”中放置的内容:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

编辑:或者如果您的目标名称与项目名称不同。

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"

3
因为我忘记了 /Y,所以它对我没用。谢谢你展示整个命令。 - Mark
13
可以使用带通配符的 xcopy 命令以及适当的开关来实现类似的结果,同时保持源文件夹的目录结构,例如:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder" - Dr1Ku
3
如果您的路径中含有空格,则需要在引号中添加+1,并在覆盖时使用/Y。 - A. Murray
5
建议在源部分中使用 $(TargetName) 替代 $(ProjectName)。 - Alexander Schmidt
3
更新我的先前评论:copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\",去掉额外的反斜杠,因为$(SolutionDir)包含一个尾随的反斜杠(至少在VS2012中) - icy
显示剩余3条评论

212

如果TargetDir或其他宏没有指向正确的位置,可以使用“..”目录返回到文件夹层次结构中的上一级目录。

例如,使用$(SolutionDir)\..\..获取您的基础目录。


有关所有宏的列表,请参见此处:

http://msdn.microsoft.com/en-us/library/c02as0cs.aspx


42

你可以尝试:

$(SolutionDir)..\..\

9
请注意,变量$(SolutionDir)已经包含反斜杠。来源:“解决方案的目录(包括驱动器和路径);包括尾部反斜杠 ''。”https://msdn.microsoft.com/en-us/library/42x5kfw4.aspx - Snicker

16

我认为这与此有关,但是我在使用msbuild命令行(从批处理文件中)直接构建时遇到了问题,与在VS内部构建不同。

类似以下内容:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>
(注意:start XCOPY 代替 XCOPY 用于绕过权限问题,该问题会导致拷贝失败。)

在批处理文件中执行 msbuild 时,宏$(SolutionDir)的值为..\,导致 XCOPY 命令失败。但在 Visual Studio 中构建则正常工作。借助 /verbosity:diagnostic 确认已评估输出。

改用宏 $(ProjectDir)..\,其效果相同,在两种构建方案下都能保留完整路径并正常工作。


1
在我忘记给出来源时,交叉链接到同一篇文章以便归功于原作者... - drzaus
“Start” 对我有用(对于在共享文件夹上使用“xcopy”)。 - AgentFire

4
直接使用msbuild有没有意义?如果你每次构建都这样做,那么你可以在结尾添加一个msbuild任务。如果你只是想看看是否能找到另一个在Visual Studio IDE上没有显示的宏值,你可以打开msbuild选项进行诊断,这将显示所有可用的变量及其当前值。
要在Visual Studio中打开此选项,请转到“工具/选项”,然后向下滚动树形视图到名为“项目和解决方案”的部分,展开该部分并单击“生成和运行”,右侧有一个下拉列表,指定构建输出详细程度,将其设置为诊断级别,就可以查看其他宏值。
因为我不知道你想达到什么程度,以及你想让你的构建有多复杂,所以这可能会给你一些想法。最近我一直在编写构建脚本,甚至作为构建的一部分执行SQL代码。如果你需要更多帮助或者一些示例构建脚本,请告诉我,但是如果只是想在构建结束时运行一个小进程,那么完整的msbuild脚本可能过于繁琐了。
希望对你有所帮助 Rihan

谢谢Rihan,但显然VS 2003似乎不支持这个!当然,我对后构建事件非常满意;-) - Preets
我没有意识到它是vs2003,因此使用msbuild作为可能的解决方案,如果我回忆起来,vs2003是在msbuild时代之前吧?谢谢回复。祝你在VS 2003上好运,自从转移到VS2005后,我就没有回头看了。 - Rihan Meij

0

这是我的构建后脚本

  1. 创建自定义路径,包括库和版本。
  2. 复制 .dll(目标文件)
  3. 复制 *.md 文件。

脚本:

md c:\_References\$(ProjectName)\$(AssemblyVersion)
xcopy $(ProjectDir)$(OutDir)$(TargetFileName) c:\_References\$(ProjectName)\$(AssemblyVersion) /y
xcopy $(ProjectDir)*.md c:\_References\$(ProjectName)\$(AssemblyVersion) /y

0

我通过重新安装VS并下载 .Net Core (3.x 和 2.x) sdk包来解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接