Tôi đang sử dụng SCons để xây dựng một dự án và cần thêm một liên kết tượng trưng vào một tệp mà nó đang cài đặt qua env.Install. (Các) lệnh nào sẽ tạo liên kết tương đương với việc chạy ln -s
trên dòng lệnh?Làm thế nào để tạo ra một liên kết tượng trưng với SCons?
Trả lời
SCons không có một lệnh liên kết tượng trưng chuyên dụng, nhưng bạn có thể sử dụng os.symlink(src, dst)
từ mô-đun os
Python:
import os
env = Environment()
def SymLink(target, source, env):
os.symlink(os.path.abspath(str(source[0])), os.path.abspath(str(target[0])))
env.Command("file.out", "file.in", SymLink)
này có thể không hoạt động chính xác trên Windows, tôi đã chỉ cố gắng nó trên Linux.
Điều này tạo ra một người thợ xây để thực hiện các công việc:
mylib = env.SharedLibrary("foobar", SRCS)
builder = Builder(action = "ln -s ${SOURCE.file} ${TARGET.file}", chdir = True)
env.Append(BUILDERS = {"Symlink" : builder})
mylib_link = env.Symlink("_foobar.so", mylib)
env.Default(mylib)
env.Default(mylib_link)
Một lần nữa, giải pháp này là dành cho Linux.
Thật không may, nó không hoạt động tốt (ở tất cả) trên thư mục: "TypeError: Thư mục/home/septi/Dropbox/Code/StreetCleaner/src/Tài nguyên tìm thấy tệp dự kiến: " – Septagram
@Septagram: Cách khắc phục sự cố thư mục? –
@ Nordlöw, xin lỗi, nhưng đã lâu rồi và tôi không biết: (Vui lòng thử các câu trả lời khác và nhận xét nếu bạn tìm thấy điều gì đó. – Septagram
Dường như có chút tiến bộ trong mã lõi SCons để hỗ trợ liên kết tượng trưng và tôi không hài lòng bất kỳ giải pháp nào tôi tìm thấy trên web. Đây là một nhà xây dựng tiềm năng kết hợp các khía cạnh của cả hai câu trả lời của Nick và richq. Ngoài ra, nó sẽ bắt tên thay đổi (do phương pháp emitter) và là nền tảng bất khả tri như tôi có thể nhận được nó.
Tôi thích trình tạo này vì nó sẽ tạo liên kết liên quan đến thư mục mà chúng được cài đặt. Người ta có thể thêm một tùy chọn để buộc các liên kết được tuyệt đối tôi giả sử, nhưng tôi đã không cần thiết hoặc muốn được nêu ra.
Hiện tại, nếu hệ điều hành không hỗ trợ các liên kết tượng trưng, tôi chỉ chuyển và không làm gì cả, nhưng có thể sử dụng os.copytree(), tuy nhiên phụ thuộc sẽ trở nên lộn xộn nếu nguồn là thư mục sao cho bộ phát sẽ cần làm một cái gì đó ưa thích. Tôi đang đưa ra bất kỳ đề xuất ở đây.
Người ta có thể đặt đoạn mã sau vào file site_scons/site_tools/symlink.py (với trống _ init _.py file ở các vị trí thích hợp). Sau đó thực hiện điều này trong file SConstruct:
SConstruct:
env = Environment()
env.Tool('symlink')
env.SymLink('link_name.txt', 'real_file.txt')
symlink.py:
import os
from os import path
from SCons.Node import FS
from SCons.Script import Action, Builder
def generate(env):
'''
SymLink(link_name,source)
env.SymLink(link_name,source)
Makes a symbolic link named "link_name" that points to the
real file or directory "source". The link produced is always
relative.
'''
bldr = Builder(action = Action(symlink_builder,symlink_print),
target_factory = FS.File,
source_factory = FS.Entry,
single_target = True,
single_source = True,
emitter = symlink_emitter)
env.Append(BUILDERS = {'SymLink' : bldr})
def exists(env):
'''
we could test if the OS supports symlinks here, or we could
use copytree as an alternative in the builder.
'''
return True
def symlink_print(target, source, env):
lnk = path.basename(target[0].abspath)
src = path.basename(source[0].abspath)
return 'Link: '+lnk+' points to '+src
def symlink_emitter(target, source, env):
'''
This emitter removes the link if the source file name has changed
since scons does not seem to catch this case.
'''
lnk = target[0].abspath
src = source[0].abspath
lnkdir,lnkname = path.split(lnk)
srcrel = path.relpath(src,lnkdir)
if int(env.get('verbose',0)) > 3:
ldir = path.relpath(lnkdir,env.Dir('#').abspath)
if rellnkdir[:2] == '..':
ldir = path.abspath(ldir)
print ' symbolic link in directory: %s' % ldir
print ' %s -> %s' % (lnkname,srcrel)
try:
if path.exists(lnk):
if os.readlink(lnk) != srcrel:
os.remove(lnk)
except AttributeError:
# no symlink available, so we remove the whole tree? (or pass)
#os.rmtree(lnk)
print 'no os.symlink capability on this system?'
return (target, source)
def symlink_builder(target, source, env):
lnk = target[0].abspath
src = source[0].abspath
lnkdir,lnkname = path.split(lnk)
srcrel = path.relpath(src,lnkdir)
if int(env.get('verbose',0)) > 4:
print 'target:', target
print 'source:', source
print 'lnk:', lnk
print 'src:', src
print 'lnkdir,lnkname:', lnkdir, lnkname
print 'srcrel:', srcrel
if int(env.get('verbose',0)) > 4:
print 'in directory: %s' % path.relpath(lnkdir,env.Dir('#').abspath)
print ' symlink: %s -> %s' % (lnkname,srcrel)
try:
os.symlink(srcrel,lnk)
except AttributeError:
# no symlink available, so we make a (deep) copy? (or pass)
#os.copytree(srcrel,lnk)
print 'no os.symlink capability on this system?'
return None
Bạn đã viết Tôi muốn giao diện tương tự như xây dựng 'Cài đặt' trong đó đối số đầu tiên là một thư mục. –
- 1. Tạo liên kết tượng trưng với Java
- 2. Làm cách nào để xóa liên kết tượng trưng?
- 3. Liên kết tượng trưng trong windows XP
- 4. .htaccess hoặc liên kết tượng trưng (symlink)
- 5. Làm thế nào để acess ctime, mtime, ... của một liên kết tượng trưng?
- 6. File.Copy() và Liên kết tượng trưng
- 7. Liên kết cứng và liên kết tượng trưng trong Unix
- 8. Kiểm tra liên kết tượng trưng
- 9. tập tin quy tắc debian tạo liên kết tượng trưng
- 10. tạo liên kết tượng trưng: Lỗi giao thức
- 11. Trong .NET, Làm thế nào để có được đích của một liên kết tượng trưng (hoặc Điểm tái tạo)?
- 12. Emacs và các liên kết tượng trưng
- 13. android: xác định liên kết tượng trưng
- 14. Sửa đổi một liên kết tượng trưng trong python
- 15. Thay thế liên kết tượng trưng quan trọng ‘an toàn’
- 16. Phát hiện một liên kết tượng trưng trong Java
- 17. Làm cách nào để có được mục tiêu của một liên kết tượng trưng?
- 18. Có gì đằng sau một liên kết tượng trưng?
- 19. Làm thế nào để sao chép chỉ các liên kết tượng trưng thông qua rsync
- 20. Làm thế nào để xem đường dẫn đầy đủ liên kết tượng trưng
- 21. Trong Perforce trên Unix, làm thế nào để bạn thêm một thư mục là một liên kết tượng trưng?
- 22. Liên kết tượng trưng đến một cái móc trong git
- 23. Tạo một liên kết tượng trưng tương đối trong python mà không sử dụng os.chdir()
- 24. chuyển đổi các liên kết tượng trưng tương đối thành các liên kết tượng trưng tuyệt đối
- 25. Làm thế nào để kiểm tra và xóa một liên kết tượng trưng nếu nó tồn tại, sử dụng Perl?
- 26. Làm thế nào để có được đường dẫn ban đầu của một liên kết tượng trưng trong PHP?
- 27. Cách tạo liên kết tượng trưng với Cygwin trong Windows 7
- 28. Làm thế nào để tìm ra nếu một tập tin là một liên kết?
- 29. Tạo liên kết tượng trưng trong tập lệnh bash trong một thư mục khác
- 30. Làm thế nào tôi có thể bãi bỏ các liên kết tượng trưng trong bash?
Đối với một số lý do nó không hoạt động khi cố gắng để tạo ra một liên kết tượng trưng trong một subdir, như "env.Command (hương vị + '/ Tài nguyên', 'src/Tài nguyên', SymLink)" nơi mà hương vị là 'gỡ lỗi' hoặc 'phát hành'. – Septagram
@Septagram xin vui lòng xem chỉnh sửa của tôi –
Sẽ không hoạt động cho các tệp được cài đặt – RzR